我的应用程序有四个选项卡:A,B,C和 D。 他们的UIViewController
由UITabBarController
管理。 该应用程序支持旋转,因此每个视图控制器都返回YES
shouldAutorotateToInterfaceOrientation
。
使用弹簧和支柱,大部分旋转由iOS自动完成。 但是,选项卡 A 还需要进一步定位,并且是在其 VC 的willRotateToInterfaceOrientation
方法中完成的。
当选择选项卡 A 的 VC 并旋转屏幕时,该 VC 会收到一条willRotateToInterfaceOrientation
消息(由 iOS 从 UITabBarController
传播),并且生成的旋转是正确的。
但是,当所选选项卡为 B 并且屏幕旋转时,不会调用 A 的willRotateToInterfaceOrientation
。 意义。 但是,如果我然后选择选项卡 A,我只会得到应用其弹簧和支柱的结果,而没有由其willRotateToInterfaceOrientation
完成的后处理。
为此苦苦挣扎了一段时间之后,在未能在网上找到解决方案之后,我想出了以下内容。 我UITabBarController
子类化,在它的willRotateToInterfaceOrientation
中,我调用所有VC的willRotateToInterfaceOrientation
,无论哪一个是selectedViewController
:
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (self.viewControllers != nil) {
for (UIViewController *v in self.viewControllers)
[v willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
}
它有效,但它看起来像一个黑客,我的问题是我是否在做正确的事情。 有没有办法告诉 iOS 在屏幕旋转后首次显示 VC 之前始终调用 VC 的willRotateToInterfaceOrientation
?
处理自定义布局的最佳方法是子类化UIView
并重写 layoutSubviews
方法。 每当视图的大小发生更改时(以及其他时间),系统都会将layoutSubviews
发送到视图。 因此,当您的视图 A 即将以不同的大小显示在屏幕上时(因为当视图 B 在屏幕上时界面被旋转),系统会向视图 A 发送 A layoutSubviews
消息,即使它不会向视图控制器 A 发送 A willRotateToInterfaceOrientation:
消息。
如果您的目标是 iOS 5.0 或更高版本,则可以覆盖 UIViewController
子类的 viewDidLayoutSubviews
方法并在那里进行布局,而不是子类化UIView
。 我更喜欢在我的视图layoutSubviews
中执行此操作,以使特定于视图的逻辑与我的控制逻辑分开。
在willRotateToInterfaceOrientation:
中执行布局也是一个坏主意,因为系统会在实际更改视图大小之前和旋转动画块之前发送该消息。 它会在旋转动画块内发送willAnimateRotationToInterfaceOrientation:duration:
、layoutSubviews
和viewDidLayoutSubviews
消息,因此,如果视图在旋转期间在屏幕上,则子视图的重新定位将进行动画处理。