我有一个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中的某些内容。我应该只是设计我的视图,以便在方向改变时不需要移动按钮吗?
谢谢!
答案 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];
}