UITabBarController选项卡的旋转和willRotateToInterfaceOrientation传播

时间:2012-06-18 20:59:10

标签: ios

我的应用有四个标签: A B C D 。他们的UIViewControllerUITabBarController管理。该应用程序支持轮换,因此每个视图控制器都会将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

1 个答案:

答案 0 :(得分:4)

处理自定义布局的最佳方法是通过继承UIView并覆盖layoutSubviews方法。只要其大小发生变化(以及其他时间),系统就会向视图发送layoutSubviews。因此,当您的视图A即将以不同的大小显示在屏幕上时(因为界面在视图B在屏幕上时旋转),系统会发送视图A layoutSubviews消息,即使它不发送视图controller A willRotateToInterfaceOrientation:消息。

如果您的目标是iOS 5.0或更高版本,则可以覆盖viewDidLayoutSubviews子类的UIViewController方法并在那里进行布局,而不是子类化UIView。我更喜欢在我的视图layoutSubviews中执行此操作,以使我的视图特定逻辑与我的控制逻辑分开。

willRotateToInterfaceOrientation:中进行布局也是一个坏主意,因为系统在实际更改视图大小之前以及旋转动画块之前发送该消息。它会在旋转动画块中发送willAnimateRotationToInterfaceOrientation:duration:layoutSubviewsviewDidLayoutSubviews消息,因此如果视图在旋转期间显示在屏幕上,则会动态重新定位子视图。