在UINavigationController堆栈中,UIViewController的方向变化

6
我有一个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。它完全正常,但这似乎(a)很繁琐,而且(b)我的各种类(如A)之间有很多重复的代码。我可以通过将代码移动到公共超类来解决(b),但这仍然似乎是我不必做的事情。
在导航堆栈上方的视图中移动我的按钮是否有更好的方法?如果需要检查IB中的内容,则我的视图来自.xib。我应该只设计我的视图,以便在方向更改时不需要移动按钮吗?
谢谢!

Mike,我有类似的情况。但是,在我的orientationChanged方法中,我有一些依赖于视图框架的计算。每个方向的视图框架都是由自动调整掩码设置的,并且在viewWillAppear:中,新方向的视图框架没有被设置。因此,我的计算出现了错误。但是,我不能在viewDidAppear中处理这个计算,因为用户可以观察到UI元素(计算出来的)的转换。 - spd
2个回答

1

我通过在viewDidAppear中实现所需的UI更改来解决了这个问题。在我的情况下,我只需调用willRotateToInterfaceOrientation即可。

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

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

如果您在viewWillAppear中完成它,效果会更好。 - TigerCoding

1

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

willAnimateRotationToInterfaceOrientation:duration:更适用于像从底部滑出视图并从侧面滑入等“特殊”动画。

将此与nib中的布局结合起来很繁琐。最近,我只是在nib中模拟了肖像UI,直到它足够好用,然后编写了相应的代码来完成相同的事情,同时支持横向。


嗯,我希望尽可能多地使用IB,但这给了我另一个实验的选择。谢谢! - Mike Kale
IB很适合快速完成某些操作,或者用于设置应用程序的初始选项卡栏/导航控制器。但是,当涉及到任何复杂的事情(如iPad与iPhone布局、在320、480、768和1024像素宽度下看起来不错的行、i18n等)时,我发现在代码中处理要容易得多;管理大量的nib文件非常麻烦(管理iPad与iPhone已经够糟糕了!)。更不用说nib加载速度慢了;这可能是苹果添加UINib的原因(它只反序列化一次,所以您可以快速创建相同的表格单元格)。 - tc.

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