自定义过渡动画unknownControllerForPresentedController和animateTransition之间的未知延迟

时间:2015-02-08 17:19:05

标签: ios iphone swift animation uiviewcontroller

我的目标是在第一个视图控制器中启动平滑动画,在第二个视图控制器中结束。

我正在尝试使用符合UIViewControllerAnimatedTransitioningUIViewControllerTransitioningDelegate协议的对象进行过渡动画。 我在故事板中设置了两个视图控制器(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时,animationControllerForPresentedControlleranimateTransition方法之间的延迟非常奇怪。有时它可能是大约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

我不知道为什么会出现这种延迟,是否有办法删除或减少它?我试图检查这是否是我的代码,但我没有找到任何证据。请随时询问更多信息。

3 个答案:

答案 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的延迟。最终用户可以很明显地看到延迟。

事实证明,问题是我推送的视图控制器正在从主线程的资产目录中加载一些大图像。

预加载图像解决了我的问题。