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

Posted

技术标签:

【中文标题】自定义模态转换关闭动画运行不同步【英文标题】:Custom Modal Transition Dismiss Animation Runs Desynchronized 【发布时间】:2015-09-07 18:09:39 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

我一点一点地定制了我的测试应用程序以更接近我的真实应用程序,我最终能够让问题再次出现。通过反复试验,我发现了引发问题的多种因素:

    呈现视图控制器在UINavigationController 内 呈现视图控制器的栏按钮项包括基于图像的UIBarButtonItem 窗口设置了色调

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

除了消除触发问题的三个因素之一之外,我找不到任何方法来阻止问题的发生。我最终确定的解决方法是删除窗口的色调颜色,而是使用UIView 的外观代理设置全局色调颜色。有一些副作用——比如UIAlertViews 的按钮被染色——但就我而言,这是一个可以接受的权衡。

【讨论】:

以上是关于自定义模态转换关闭动画运行不同步的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:自定义模态动画

关闭自定义模式视图控制器

自定义 UIView 转换 [关闭]

自定义 inputView 在模态演示期间未正确设置动画

如何自定义模态视图控制器呈现动画?

自定义模态视图的转场动画