UIViewController方向在UINavigationController堆栈中发生变化

时间:2010-10-13 22:10:03

标签: iphone

我有一个UINavigationController,上面有两个UIViewControllers(A和B)。从A,我把B推到堆栈上。然后用户重新定位设备。我需要在屏幕上移动一些东西(按钮等)以便在A的新方向上可见。

我发现-shouldAutorotateToInterfaceOrientation在A和B上都被调用(并返回YES)。但是-will / -didRotateFromInterfaceOrientation只能在可见的ViewController(B)上调用。当B从堆栈弹出时,A以新的(正确的)方向显示,但没有根据需要移动按钮。

为了解决这个问题,我发现自己实现了以下模式:

头文件中的

@interface A : UIViewController {
    // ...
    UIInterfaceOrientation layoutOrientation;
}
// ...
- (void)orientationChanged;
@end
在.m文件中

- (void)viewDidLoad {
    // ...
    layoutOrientation = self.interfaceOrientation;
}

- (void)viewWillAppear:(BOOL)animated {
    // ...
    if (layoutOrientation != self.interfaceOrientation) {
        [self orientationChanged];
    }
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [self orientationChanged];
}

- (void)orientationChanged {
    // move my buttons
    layoutOrientation = self.interfaceOrientation;
}

基本上,我正在检查-viewWillAppear中的方向是否已更改,并在需要时执行更新UI的工作。它运行得很好,但这看起来很乏味,而且(b)我的各种类中有很多重复的代码,例如A.我可以通过将代码移动到一个共同的超类来修复(b),但这似乎仍然是我不应该这样做。

有没有更好的方法在导航堆栈上不是最顶层的视图上移动我的按钮?我的观点来自.xibs,如果我需要检查IB中的某些内容。我应该只是设计我的视图,以便在方向改变时不需要移动按钮吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我更喜欢在-layoutSubviews中尽可能多地进行布局;有多种方法可以检测方向,但我只是将bounds.size.width与bounds.size.height进行比较。

willAnimateRotationToInterfaceOrientation:duration:更适用于“特殊”动画,例如从底部和侧面滑动视图。

将此与笔尖中的布局相结合是单调乏味的。最近,我刚刚在笔尖中模拟了肖像UI,直到它运行得很好,然后编写了相同的代码来做同样的事情,但也支持景观。

答案 1 :(得分:1)

我通过在viewDidAppear中实现所需的UI更改来解决。在我的情况下,我只需调用willRotateToInterfaceOrientation。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
}