自定义模态转换消除动画运行失步

时间:2015-09-07 18:09:39

标签: ios uiviewcontroller modalviewcontroller uipresentationcontroller

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

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

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

1 个答案:

答案 0 :(得分:2)

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

无论我如何重构或简化我的动画代码,我总是得到相同的结果,所以我开始怀疑我的项目设置方式是否存在导致问题的方式。我把我的自定义模态转换代码放到一个干净的项目中,瞧,它在第一次尝试时效果很好。

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

  1. 呈现视图控制器位于UINavigationController
  2. 呈现视图控制器的条形按钮项目包括基于图像的UIBarButtonItem
  3. 窗口具有色调设置
  4. 当满足这三个条件时,animateAlongsideTransition:dismissalTransitionWillBegin电话的动画块将在animateWithDuration:animateTransition电话的动画块之前执行。这似乎阻止了自定义视图的动画获得过渡动画的持续时间。在我的测试中,animateAlongsideTransition:动画以0.215秒的持续时间运行,我相信这是默认持续时间。

    除了删除触发它的三个因素之一之外,我一直无法找到阻止问题发生的任何方法。我最终确定的解决方法是删除窗口的色调颜色,而是使用UIView的外观代理设置全局色调颜色。有一些副作用 - 比如UIAlertView s'按钮着色 - 但是对于我来说这是一个可以接受的权衡。