我的应用有四个标签: A , B , C 和 D 。他们的UIViewController
由UITabBarController
管理。该应用程序支持轮换,因此每个视图控制器都会将YES
返回到shouldAutorotateToInterfaceOrientation
。
使用弹簧和支柱,大部分旋转都是由iOS自动完成的。但是,标签 A 还需要进一步定位,并且在VC的willRotateToInterfaceOrientation
方法中完成。
如果选择了VC选项卡 A 并且屏幕已旋转,则该VC会收到willRotateToInterfaceOrientation
消息(由UITabBarController
从iOS传播),以及产生的轮播是正确的。
但是,如果所选标签为 B 并且屏幕已旋转,则不会调用 A 的willRotateToInterfaceOrientation
。说得通。但是如果我然后选择标签 A ,我只会得到应用其弹簧和支柱的结果,而不会通过其willRotateToInterfaceOrientation
进行后处理。
经过一段时间的努力,在找不到在线解决方案后,我想出了以下内容。我将UITabBarController
子类化,并在其willRotateToInterfaceOrientation
中将所有风险投标称为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
?
答案 0 :(得分:4)
处理自定义布局的最佳方法是通过继承UIView
并覆盖layoutSubviews
方法。只要其大小发生变化(以及其他时间),系统就会向视图发送layoutSubviews
。因此,当您的视图A即将以不同的大小显示在屏幕上时(因为界面在视图B在屏幕上时旋转),系统会发送视图A layoutSubviews
消息,即使它不发送视图controller A willRotateToInterfaceOrientation:
消息。
如果您的目标是iOS 5.0或更高版本,则可以覆盖viewDidLayoutSubviews
子类的UIViewController
方法并在那里进行布局,而不是子类化UIView
。我更喜欢在我的视图layoutSubviews
中执行此操作,以使我的视图特定逻辑与我的控制逻辑分开。
在willRotateToInterfaceOrientation:
中进行布局也是一个坏主意,因为系统在实际更改视图大小之前以及旋转动画块之前发送该消息。它会在旋转动画块中发送willAnimateRotationToInterfaceOrientation:duration:
,layoutSubviews
和viewDidLayoutSubviews
消息,因此如果视图在旋转期间显示在屏幕上,则会动态重新定位子视图。