Я написал собственный подкласс UIStoryboardSegue для создания переходов постепенного исчезновения / постепенного исчезновения, перекрестного растворения между двумя UIViewControllers.
Основные виды контроллера вида имеют кнопки, которые центрированы внутри каждого из них (помечены «Контроллер вида 1» и «Контроллер вида 2»), поэтому я предполагаю, что при перекрестном слиянии одного с другим - настройкаони оба являются потомками одного и того же суперпредставления и делают их кадры одинаковыми - кнопки также будут выровнены.
class SwapSegue: UIStoryboardSegue {
override func perform() {
fade()
}
func fade() {
destination.view.alpha = 0
source.view.superview?.addSubview(destination.view)
destination.view.frame = source.view.frame
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseInOut, animations: {
self.destination.view.alpha = 1
}, completion: { success in
if var controllerStack = self.source.navigationController?.viewControllers {
controllerStack[controllerStack.firstIndex(of: self.source)!] = self.destination
self.source.navigationController?.setViewControllers(controllerStack, animated: false)
} else {
self.source.present(self.destination, animated: false, completion: nil)
}
})
}
}
Это почти работает, но не правильно позиционирует вид назначения во время перехода,таким образом, в конце, когда анимация segue заканчивается, появляется «pop». Похоже, что выравнивание примерно на высоту навигационной панели отключено, поэтому я подозреваю, что это ключ.
(Примечание: в этом циклическом GIF вы можете увидеть нажатие кнопки «View Controller 1», анимированное перекрестное затухание со смещенными кнопками, а затем «pop» в конце, когда анимациязавершается, и контроллер представления назначения наконец помещается правильно.)
Как правильно расположить его так, чтобы он был выровнен, как должно быть, ианимация будет плавной?