В своей работе над многоэкранным приложением iOS я пытаюсь заставить работать мою первую анимированную транзакцию. Вместо использования стандартных анимаций при представлении модальных и полноэкранных экранов я хочу иметь горизонтальный слайд в анимации.
Я сделал эту работу, переопределив perform
в UIStoryboardSegue, и заставил анимацию и транзакцию выполняться отсюда.
В целом, это работает, за исключением одного случая, когда навигационный контроллер встраивает представление.
В этом случае я следовал учебному пособию, показывающему, как именно выполняется пользовательская транзакция. достигается путем реализации протокола UINavigationControllerDelegate для конкретного контроллера навигации.
import Foundation
import UIKit
class AnimatedNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
func navigationController(_ navigationController: UINavigationController,
animationControllerFor operation: UINavigationController.Operation,
from fromVC: UIViewController,
to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return NavigationControllerTransition()
}
}
К сожалению, делегат, который должен возвращать объект анимации:
navigationController(_:animationControllerFor:from:to:)
, никогда не вызывается и это моя основная проблема.
В упомянутом учебнике кнопка используется для выполнения вызова к контроллеру навигации, который выдвигает конечный вид с анимацией, установленной в true:
navigationController.pushViewController(view, animated:true)
В моем случае, я подозреваю, что проблема заключается в том, что Контроллер навигации выдвигает представление, не устанавливая для параметра анимации значение true, и это объясняет, почему делегат транзакции никогда не вызывается.
(подтверждение этой теории, конечно, немного поможет).
Следовательно, я попытался реализовать пользовательский переход, который представляет представление, вызвав функцию pu sh с анимацией, установленной в true.
К сожалению, я не смог заставить это работать.
Когда вызывается navigationController.pushViewController(view, animated:true)
, возникает исключение, говорящее о том, что представление уже выдвинуто.
Я много пробовал без удачи. Код выглядит так:
class NavigationControllerSegue: UIStoryboardSegue {
override func perform() {
let navigationController = self.destination as! UINavigationController
let view = navigationController.viewControllers.first!
navigationController.pushViewController(view, animated: true)
}
}