4

我的应用程序有四个选项卡:ABCD。它们UIViewController由 管理UITabBarController。该应用程序支持旋转,因此每个视图控制器都返回YESshouldAutorotateToInterfaceOrientation.

使用弹簧和支柱,大部分旋转由 iOS 自动完成。但是,tab A也需要进一步定位,在其 VC 的willRotateToInterfaceOrientation方法中完成。

When the VC for tab A is selected and the screen is rotated, that VC receives a willRotateToInterfaceOrientationmessage (propagated by iOS from UITabBarController), and the resulting rotation is correct.

但是,当所选选项卡为B并且屏幕旋转时,调用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];
    }
}

它有效,但它看起来像一个黑客,我的问题是我是否做对了。有没有办法告诉 iOSwillRotateToInterfaceOrientation在屏幕旋转后第一次显示之前总是调用 VC?

4

1 回答 1

4

处理自定义布局的最佳方法是继承UIView和覆盖该layoutSubviews方法。layoutSubviews每当视图的大小发生变化时(以及其他时间),系统都会发送到视图。因此,当您的视图 A 即将以不同大小出现在屏幕上时(因为在视图 B 在屏幕上时界面已旋转),系统会向视图 A 发送layoutSubviews消息,即使它没有向视图控制器 A 发送willRotateToInterfaceOrientation:消息。

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

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

于 2012-06-18T21:33:08.050 回答