根视图控制器动画转换,初始方向错误。

50

我遵循了这个线程:RootViewController Switch Transition Animation来将window.rootViewController从A过渡到B再到C。代码如下:

[UIView transitionWithView:self.window 
                  duration:0.5 
                   options: UIViewAnimationOptionTransitionFlipFromLeft 
                animations:^{
                               self.window.rootViewController = newViewController;
                } 
                completion:nil];

我的应用程序只支持横屏,但在rootViewController转换期间,新的视图控制器以纵向模式出现,然后迅速旋转为横向模式。

我确定:

  1. 我已将UISupportedOrientation设置为横向(主页按钮靠右)
  2. 对于每个视图控制器,在shouldAutoRotateToOrientation方法中,我仅设置为横向

其他可能的原因是什么?

2个回答

121

我刚刚研究了这个问题,因为我一直遇到相同的问题。我随机尝试了以下内容,并且它完美地解决了问题:

[UIView
    transitionWithView:window 
    duration:0.5
    options:UIViewAnimationOptionTransitionCrossDissolve
    animations:^(void) {
        BOOL oldState = [UIView areAnimationsEnabled];
        [UIView setAnimationsEnabled:NO];
        [(ICApp *)sharedApplication.delegate window].rootViewController = self;
        [UIView setAnimationsEnabled:oldState];
    } 
    completion:nil];

我知道在动画块内禁用/启用动画有点奇怪,但是交叉溶解动画可以动画化,而旋转不行 - 视图控制器似乎已经旋转并准备好了。


1
在我的iOS 6上可以工作。它有道理,因为禁用动画只会影响之后提交的动画。 - Edward Huynh
1
对我来说,在iOS 6上也可以工作。 - Kalle
这个解决方案比所有类似问题的答案都要完美得多!在iOS 7中运行良好。顺便问一下,我怎么才能做一个向上/向下滑动的过渡效果? - Greg Wang
我自己没有收到那个警告 - 而且从我所看到的情况来看,它也没有进行快照。也许你可以发布一个单独的问题并在此处链接,并包括你的代码? - Kalle
在iOS7上完美运行! - Gary Lyn
显示剩余7条评论

9
只需添加另一个动画选项UIViewAnimationOptionAllowAnimatedContent:
[UIView transitionWithView:self.window duration:0.5 options:(UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowAnimatedContent) animations:^{
    self.window.rootViewController = newViewController;
} completion:nil];

这对我不起作用。新的视图控制器仍然以纵向模式出现,然后旋转到横向模式,就像问题描述的那样。 - Kristopher Johnson
对于任何阅读此内容的iOS 8.3用户,只有使用Flip转换才能看起来“不错”,但仍然会在目标控制器中显示一些控制器调整大小。使用setAnimationsEnabled可以获得更好的视觉效果。 - CryingHippo
允许对象沿着过渡视图动画的好答案。 - Fede Cugliandolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接