在popViewControllerAnimated上没有调用willAnimateRotationToInterfaceOrientation

时间:2010-08-29 16:02:19

标签: iphone ipad orientation

在MainViewController中,我必须在方向更改时调整一些图像。简单 - 只需将代码添加到 willAnimateRotationToInterfaceOrientation:回调

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
  NSLog(@"orientation: %@", name(orientation));
  ..

按预期工作。在Portrait中,我将另一个方向感知UIViewController推送到UINavigationController上。我转向风景,一切都很好。

然后我通过调用

返回MainViewController
[self.navigationController popViewControllerAnimated:YES];

当MainViewController的子视图根据autoresize蒙版调整为Landscape时, willAnimateRotationToInterfaceOrientation:不会被调用!

我原本希望 willAnimateRotationToInterfaceOrientation:在不在导航控制器堆栈之上时也被调用,或者至少在返回到堆栈顶部时被调用。

我假设我可以在弹出之前手动调用 willAnimateRotationToInterfaceOrientation:,但感觉不对。

我错过了什么?

5 个答案:

答案 0 :(得分:36)

这是我所看到的预期行为。如果UIVC不在堆栈顶部,则不应调用willAnimateRotationToInterfaceOrientation,因为此时没有动画旋转。我在我正在处理的应用程序中处理此问题的方式与上面的海报类似。任何支持所有方向的UIVC都会获得一种新方法

- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation;

从两个地方调用此方法:


-(void) viewWillAppear: (BOOL) animated {
  [super viewWillAppear: animated];
  [self updateLayoutForNewOrientation: self.interfaceOrientation];
}

-(void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation duration: (NSTimeInterval) duration { [self updateLayoutForNewOrientation: interfaceOrientation]; }

新方法很简单:


- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation {
    if (UIInterfaceOrientationIsLandscape(orientation)) {
        // Do some stuff
    } else {
        // Do some other stuff
    }
}

此外,如果您担心代码在实际不需要时运行,您可以通过viewDidDisappear中设置的实例变量将新UIVC推送到堆栈时跟踪设备的方向并查阅它以确定如果你想“做那些东西”

答案 1 :(得分:2)

这不是正确的行为吗?因为动画回调只应在动画方向更改之前调用。当您弹出最顶层视图时,您会看到弹出动画,然后是下面的已旋转的视图。没有旋转动画,因此没有回调。 (但你当然应该收到willRotateToInterfaceOrientation:duration:。)

P.S。我在GitHub上进行了sample Xcode project接口导向实验,您可能会感兴趣。

答案 2 :(得分:1)

因为当你回到主视图时没有发生旋转,所以不会调用willAnimateRotationToInterfaceOrientation。但是,如果您希望根据更改的方向执行某些操作,可以将以下代码添加到主viewcontroller的viewWillAppear方法

- (void)viewWillAppear:(BOOL)animated {
UIInterfaceOrientation statusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    if(UIInterfaceOrientationIsPortrait(statusBarOrientation)){
        NSLog(@"Portrait");
....your code....
    }
    else {
        NSLog(@"Landscape");
....your code....
    }


}

答案 3 :(得分:1)

我和斯科特在一起 - 我认为这是必须预期的行为。

另请参阅View Controller Programming Guide,其中指出只有最前面的控制器才会调用方法。 (搜索“最前面”以查找文档中的两个相关位置。)

答案 4 :(得分:0)

我也经历过这种行为,我认为这是出于性能和架构原因; AFAIK这个方法在UIView动画上下文中调用(它允许你改变帧和中心,并且在一切旋转时都有一个漂亮的动画),当你的视图控制器不可见时,UIKit可以避免执行这个方法,或者只是不可能执行它,因为视图不可见(并且可能无法为您可以看到的内容制作动画)。 再次,这是纯粹的猜测:)