我的目标是在第一个视图控制器中启动平滑动画,在第二个视图控制器中结束。
我正在尝试使用符合UIViewControllerAnimatedTransitioning
和UIViewControllerTransitioningDelegate
协议的对象进行过渡动画。
我在故事板中设置了两个视图控制器(VC)并将它们与segue连接(默认显示)。我还在第一个VC中展开了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,从第二个到第一个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
我不知道为什么会出现这种延迟,是否有办法删除或减少它?我试图检查这是否是我的代码,但我没有找到任何证据。请随时询问更多信息。
答案 0 :(得分:4)
我遇到了同样的问题。你可能不会从主线程(presentViewController调用)触发动画。
这解决了我的问题(Objective-C代码):
dispatch_async(dispatch_get_main_queue(),
^{
[self presentViewController:viewControllerToPresent
animated:YES
completion:nil];
});
答案 1 :(得分:2)
我在讨论here,作者 - tamas.zahola
[self presentViewController:myViewController animated:YES completion:nil];
dispatch_async(dispatch_get_main_queue(), ^{}); // <--- this line
答案 2 :(得分:1)
我也经历过。在我的情况下,我看到在推送具有自定义动画过渡的视图控制器的时间与调用animateTransition(using transitionContext:)
方法的时间之间存在0.7s的延迟。最终用户可以很明显地看到延迟。
事实证明,问题是我推送的视图控制器正在从主线程的资产目录中加载一些大图像。
预加载图像解决了我的问题。