animationControllerForPresentedController 和 animateTransition 之间的自定义过渡动画未知延迟
Posted
技术标签:
【中文标题】animationControllerForPresentedController 和 animateTransition 之间的自定义过渡动画未知延迟【英文标题】:Custom transition animation unknown delay between animationControllerForPresentedController and animateTransition 【发布时间】:2015-02-08 17:19:04 【问题描述】:我的目标是使动画在第一个视图控制器开始并在第二个视图控制器结束。
我正在使用符合UIViewControllerAnimatedTransitioning
和UIViewControllerTransitioningDelegate
协议的对象来试验过渡动画。
我在情节提要中设置了两个视图控制器(VC)并将它们与 segue 连接(默认显示)。我还在第一个 VC 中做了 unwind segue 方法,并在第二个 VC 中为它设置了一个按钮。
我有一个奇怪的问题。 我的对象有方法
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning?
self.presenting = true
NSLog("start")
return self
func animateTransition(transitionContext: UIViewControllerContextTransitioning)
if presenting
NSLog("Animation Push")
transitionPush(transitionContext)
else
NSLog("Animation Pop")
transitionPop(transitionContext)
我有两种不同的动画方法,从第一个 VC 到第二个,从第二个到第一个 VC。
当我激活 segue 时,animationControllerForPresentedController
和 animateTransition
方法之间有非常奇怪的延迟。有时可能是 1 秒左右,而我的整个过渡动画必须是 1 秒加上这个意外延迟太大。
这是一个日志:
2015-02-08 19:52:33.528 MyApp[1318:119598] start
2015-02-08 19:52:33.979 MyApp[1318:119598] Animation Push
我不知道为什么会出现这种延迟,是否有办法消除或减少它?我试图检查这是否是我的代码,但我没有找到任何证据。随时询问更多信息。
【问题讨论】:
你能解决这个问题吗?也遇到了同样的问题。 我看到这篇文章讨论了 ios8 错误。我尝试了一些解决方法,但还没有任何工作。 gotoanswer.com/… @TWilly 现在我把这个问题放在一边,但我很快就会回来。但现在我对此有一些想法。首先,我在编辑部分***.com/a/25618714/1207902 的另一个主题的回答中描述了它,我也认为这可能是我的模型,处理数据的时间太长,这会导致这种延迟。无论如何,当我完成后,我会回到这个问题并尝试写一个答案。但是您可以查看我指定的点。 @flinth 我遇到了同样的问题,从按下按钮到动画开始之间有大约半秒的延迟,即使所有内容都在主线程上 @startupthekid 我暂时改变了动画方法,所以在这种情况下我没有发现问题。但是,我有一个类似的延迟问题,我的自定义字体没有复制到设备上。当我用该字体打开 VC 时,系统试图找到它并在所有字体(我认为)中搜索该字体。当我修复字体复制问题时,这种延迟消失了。我向苹果发送了一个错误,但我无法重复该错误。但是,这种缺少自定义字体延迟完全是这种情况下的问题,所以,检查一下,也许你有类似的东西......我很快就会回到这个问题并写一个答案是我会有一个:)跨度> 【参考方案1】:我遇到了同样的问题。您可能没有从主线程(presentViewController 调用)触发动画。
这为我解决了这个问题(Objective-C 代码):
dispatch_async(dispatch_get_main_queue(),
^
[self presentViewController:viewControllerToPresent
animated:YES
completion:nil];
);
【讨论】:
这对我不起作用。也许主线程已经因为某种原因被阻塞了,这阻止了转换的发生?还是按钮以某种方式被停用? 这很奇怪——因为我在调用时看到了主线程,但是你的代码对我有帮助【参考方案2】:我在讨论中找到了解决方案(解决方法)here,作者 – tamas.zahola
[self presentViewController:myViewController animated:YES completion:nil];
dispatch_async(dispatch_get_main_queue(), ^); // <--- this line
【讨论】:
【参考方案3】:我也经历过。在我的情况下,我看到在我推送具有自定义动画转换的视图控制器的时间和调用 animateTransition(using transitionContext:)
方法的时间之间存在 0.7 秒的延迟。最终用户可以高度感知延迟。
事实证明,我正在推送的视图控制器正在从主线程的资产目录中加载一些大图像。
预加载图像解决了我的问题。
【讨论】:
事实证明,这个问题的一般解决方案是检查目标视图控制器将使用的每个资源。可悲的是,我没有写清楚的编辑/回答这个问题,但我的问题是因为我的包中没有自定义字体而发生的。 iOS 检查所有字体库以找到它,如果不存在,请替换。我有一个延误的情况。您遇到了基本相同的问题 - 同步加载资源需要花费太多时间。 我不会考虑丢失的字体大小写,但是是的,这很有意义。在***上到处都埋藏着许多小智慧。谢谢! 在我的情况下,这是因为我在 UIView 组件中调用 sizeToFit(),这导致了很大的延迟以上是关于animationControllerForPresentedController 和 animateTransition 之间的自定义过渡动画未知延迟的主要内容,如果未能解决你的问题,请参考以下文章