3

У меня есть специальная модальная презентация и пользовательский контроллер для представления (подкласс 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()!) 
    } 
} 

Это работает, но я не уверен, что это лучший подход.

В документации говорится, что контроллер презентации должен отвечать только за выполнение каких-либо дополнительных настроек или анимации во время перехода, а основная работа для презентации должна выполняться в анимированном переходном объекте.

Можно ли всегда настраивать представления в контроллере представления и анимировать их только в анимированном переходном объекте?

Есть ли лучший способ решить эту проблему?

ответ

1

Решено, что, переместив всю логику настроек просмотров из анимированного перехода на контроллер представления.

Смежные вопросы