UITabBar控制器的选项卡的旋转和将旋转到接口方向传播



我的应用程序有四个选项卡:A,B,CD。 他们的UIViewControllerUITabBarController管理。 该应用程序支持旋转,因此每个视图控制器都返回YES shouldAutorotateToInterfaceOrientation

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

当选择选项卡 A 的 VC 并旋转屏幕时,该 VC 会收到一条willRotateToInterfaceOrientation消息(由 iOS 从 UITabBarController 传播),并且生成的旋转是正确的。

但是,当所选选项卡为 B 并且屏幕旋转时,不会调用 AwillRotateToInterfaceOrientation。 意义。 但是,如果我然后选择选项卡 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:layoutSubviewsviewDidLayoutSubviews消息,因此,如果视图在旋转期间在屏幕上,则子视图的重新定位将进行动画处理。

最新更新