У меня есть специальная модальная презентация и пользовательский контроллер для представления (подкласс UIViewController). Это собственный переходный делегат и возвращает некоторый анимированный переходный объект и контроллер представления. Я использую анимированный переходный объект, чтобы добавить представленный вид в контейнерный вид при представлении и удалить его при увольнении и, конечно же, оживить его. Я использую контроллер представления для добавления вспомогательного подпрограммы.Представление пользовательского представления контроллера без анимации
public final class PopoverPresentationController: UIPresentationController {
private let touchForwardingView = TouchForwardingView()
override public func presentationTransitionWillBegin() {
super.presentationTransitionWillBegin()
self.containerView?.insertSubview(touchForwardingView, atIndex: 0)
}
}
public final class PopoverAnimatedTransitioning: NSObject, UIViewControllerAnimatedTransitioning {
func setupView(containerView: UIView, presentedView: UIView) {
//adds presented view to container view
}
public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
//1. setup views
//2. animate presentation or dismissal
}
}
public class PopoverViewController: UIViewController, UIViewControllerTransitioningDelegate {
init(...) {
...
modalPresentationStyle = .Custom
transitioningDelegate = self
}
public func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return PopoverAnimatedTransitioning(forPresenting: true, position: position, fromView: fromView)
}
public func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return PopoverAnimatedTransitioning(forPresenting: false, position: position, fromView: fromView)
}
public func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController?, sourceViewController source: UIViewController) -> UIPresentationController? {
return PopoverPresentationController(presentedViewController: presented, presentingViewController: presenting, position: position, fromView: fromView)
}
}
Все отлично работает, когда я представляю контроллер с presentViewController
и передать верно animated
собственности. Но когда я хочу представить его без анимации и передать false, UIKit вызывает только метод presentationControllerForPresentedViewController
и вообще не вызывает animationControllerForPresentedController
. И поскольку представленное представление добавляется в иерархию представлений и помещается в нее в объект перехода, который никогда не создается, ничего не отображается.
Что я делаю, я проверяю контроллер презентации, если переход анимирован, и если я не создаю анимированный переходный объект вручную и настрою его на создание представлений.
override public func presentationTransitionWillBegin() {
...
if let transitionCoordinator = presentedViewController.transitionCoordinator() where !transitionCoordinator.isAnimated() {
let transition = PopoverAnimatedTransitioning(forPresenting: true, position: position, fromView: fromView)
transition.setupView(containerView!, presentedView: presentedView()!)
}
}
Это работает, но я не уверен, что это лучший подход.
В документации говорится, что контроллер презентации должен отвечать только за выполнение каких-либо дополнительных настроек или анимации во время перехода, а основная работа для презентации должна выполняться в анимированном переходном объекте.
Можно ли всегда настраивать представления в контроллере представления и анимировать их только в анимированном переходном объекте?
Есть ли лучший способ решить эту проблему?