自定义模态转换关闭动画运行不同步

Custom Modal Transition Dismiss Animation Runs Desynchronized

我一直在努力实现自定义模式转换,它使用 UIPresentationController 子类在演示和关闭期间创建和操作附加视图。 Apple 在 the documentation 中提供了如何执行此操作的示例,但我遇到了障碍。

呈现模态时,我的自定义视图动画效果很好,但是当我关闭模态时,应用到 dismissalTransitionWillBegin 中自定义视图的动画与过渡动画对象指定的动画不同步我从 animationControllerForDismissedController: 回来了。具体来说,自定义视图的动画忽略了过渡动画的持续时间并且总是播放得非常快(持续时间似乎在 0.2 秒左右)。

什么会导致 animateAlongsideTransition:completion: 忽略基本动画的持续时间?

问题的根源似乎是 iOS 中的错误。

无论我如何重构或简化我的动画代码,我总是得到相同的结果,所以我开始怀疑我的项目设置方式是否可能导致问题。我将我的自定义模态 t运行sition 代码放到一个干净的项目中,你瞧,它在第一次尝试时运行完美。

一点一点地,我自定义了我的测试应用程序以更接近我的真实应用程序,我最终能够让问题重现。通过反复试验,我发现了触发问题的因素组合:

  1. 呈现视图控制器在 UINavigationController
  2. 呈现视图控制器的栏按钮项包括基于图像的 UIBarButtonItem
  3. window 有色调颜色集

当满足这三个条件时,dismissalTransitionWillBegin 中的 animateAlongsideTransition: 调用的动画块将在 animateTransition 中的 animateWithDuration: 调用的动画块之前执行.这似乎阻止了自定义视图的动画获得 t运行sition 动画的持续时间。在我的测试中,animateAlongsideTransition: 动画 运行 持续时间为 0.215 秒,我认为这是默认持续时间。

除了消除触发问题的三个因素之一之外,我一直无法找到任何方法来防止问题发生。我最终确定的解决方法是删除 window 的色调颜色,而是使用 UIView's appearance proxy. There are some side-effects--like UIAlertViews' 按钮设置全局色调颜色--,但就我的目的而言,这是可以接受的权衡。