2

我刚刚花了几个小时追踪一个恰好位于转换驱动程序对象中的错误,interruptibleAnimator方法被多次调用,其中:

  1. UIViewPropertyAnimator完成闭包包含对[unowned self]完成其转换控制器传递的转换上下文的引用self.context.completeTransition(true)
  2. 实现UIViewControllerAnimatedTransitioning并且是 a的转换控制器UINavigationControllerDelegate通过其animate方法传递上下文

    extension NavigationTransitionController: UIViewControllerAnimatedTransitioning {
    
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return transitionDuration
    }
    
    func animationEnded(_ transitionCompleted: Bool) {
    
        // Clean up our helper object and any additional state
        transitionDriver = nil
    }
    
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        transitionDriver = TransitionDriver(context: transitionContext, duration: transitionDuration)
        interruptibleAnimator(using: transitionContext).startAnimation()
    }
    
    func interruptibleAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating {
        return transitionDriver!.transitionAnimator
    }
    

除非我在这里遗漏了一些非常基本的东西,否则我不知道为什么转换控制器会多次调用该interruptibleAnimator方法。

我的结构受到 Apple在 WWDC 2016 演讲中介绍的内容的启发;如果您下载,放置一个断点并启动他们的 Photo Transitioning 应用程序,您可以自己看到在他们的情况下,该方法被调用两次以实现相同的转换。

有人可以告诉我我是在追鬼还是这是一种合法的奇怪行为?

4

1 回答 1

2

Apple 在“标题文档”中声明UIViewControllerAnimatedTransitioning

/// A conforming object implements this method if the transition it creates can
/// be interrupted. For example, it could return an instance of a
/// UIViewPropertyAnimator. It is expected that this method will return the same
/// instance for the life of a transition.
@available(iOS 10.0, *)
optional public func interruptibleAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating

WWDC Session 2016的 29:34 分钟也有同样的说明。27:33 分钟幻灯片上的示例实现似乎具有误导性/错误。

它被多次调用的原因超出了我的知识范围。

于 2017-07-04T10:28:15.873 回答