一个UINavigationController的UITabBarController和选择性内自转

2019-06-27 01:43发布

问候! 这里的情景。

与导航控制器开始(并且没有标签栏是本 - 它是从先前的视图控制器推隐藏),我初始化一个新的视图控制器并将其推入导航控制器堆栈。 这种新的VC包含一个寂寞的UIView到我与编程相同的帧添加一个UIScrollView。 (我想避免的UIView,但是这是我能得到self.view被分配到的东西的唯一方法。我怀疑在viewDidLoad中铸造一个UIScrollView的UIView是不可取的。)

所以现在我们有一个导航栏,滚动视图。 我已经设定,通过一些图片滚动(大惊喜,我知道!),而且工作得很好。 现在我想这个支持自动旋转。 所以,我在VC像这样回应:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

编译并运行。 Aaaand ...什么都没有。 很显然,我做错了什么。

现在,我已经阅读了有关职位的UINavigationController和自转 ,而我得到的偷渡怀疑,我要对此错误的方式,并使其方式比必要的更加复杂。

有一定是提出支持自动旋转一个UIScrollView一个更好的办法。 也许,导航控制器的凑了过来,但我不知道怎么去解决它。

理想情况下,我想,没有任何形式的导航栏显示的东西。 相反,我们必须出现/从顶部隐藏(像你看到在播放视频时)工具栏/状态栏。 如果导航栏必须保持 - 或者,如果这是一个真正的短高度导航栏我打视频与工具栏时,看到的,但我去绕的事情吗? 关键是,我只是想查看PIX时,在这个特殊的模式,旋转。 未在其他任何时间。

敢我尝试使用模式的VC? (Yeccch - 不,这不可能是正确的或者另外,它反正有一个导航栏。)

Answer 1:

你可以解决这个问题,而不通过创建一个的UITabBarController类继承。

这是处理我的情况下我有我的选项卡和自定义的UIViewController子类作为UINavigationControllers的根视图控制器相关联的匿名UINavigationControllers类实现:

@implementation UITabBarController (Rotation)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{   
    if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
        UIViewController *rootController = [((UINavigationController *)self.selectedViewController).viewControllers objectAtIndex:0];
        return [rootController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

我也有默认返回YES上UINavigationController的一个类别。 因此,默认行为是使旋转,我可以从shouldAutorotateToInterfaceOrientation返回NO:对于只是我想禁用旋转控制器和方向interfaceOrientation。



Answer 2:

是的-它我想象的要简单!

诚然,没有标签栏是可见的...但是这仍然是,在核心,基于酒吧标签应用。

除非允许的UITabBarController自转,所有的赌注都关闭任何其他意见。 所以,它只是子类的UITabBarController和适当应对的问题shouldAutorotateToInterfaceOrientation:对使它在App代表的Xcode中的默认操作的一部分)。

你是怎样做的? 很高兴你问。 按照只有当您创建使用Xcode的默认选项卡栏控制器应用这些步骤。 (BACKUP尝试这个!免责声明,内容非常重要之前,你的工作。)

  1. 创建一个新的UIViewController子类(我们把它叫做VC)。 调整它是一个的UITabBarController的子类有一个明确的委托UITabBarControllerDelegate
  2. 所有的应用程序委托标签栏代表位移植到这个新的VC。
  3. 在新的VC的viewDidLoad的方法,添加self.delegate = self; 到最后。
  4. MainWindow.xib中 (或任何你的标签栏控制器和标签栏被定义),挑选你的标签栏控制器对象,并转到身份检查(Cmd的-4)。 类更改为新的VC,而不是标准的UITabBarController类。

现在,我们的业务。 只需添加这个新的VC来源:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES; // Adjust to taste
}

为什么代表的东西? 在IB文件的所有者是UIApplication的 ,我无法通过IB领带代表我新的VC。 因为我想有机会应对委托方法,我添加它明确。 如果你不需要的是,它的确定要离开它。 (如果这可以在IB做,有人请帮腔!)

唯一剩下的诀窍是将其设置为YES 选择性 。 您可能不希望支持所有自转的时间(这是我的情况)。 下面是我如何做到这一点。 首先,我改变新添加的方法(从上面)......这样的:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {   
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

现在我可以以同样的方法从任何我的应用程序的风险投资公司的回应,它会冒泡到标签栏控制器! 举例来说,在我的应用程序,我有一个VC,我只想在肖像显示,所以我像这样回应:

return (interfaceOrientation == UIInterfaceOrientationPortrait);

然而,同样的VC可以将用户带到照相馆,对于这一点想允许一些旋转。 在VC的自动旋转的方法,我有不同的反应:

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

现在画廊视图将允许自动旋转至所有方向除倒肖像,加上当我回到了视图控制器链,定向恢复到肖像。 :)



Answer 3:

它可以简单一些:

1)子类UITabBarController和实施shouldAutorotate ...像你描述(第二代码片段)

2)更改xxxAppDelegate.h有类UITabBarController变更为刚创建的子类。 (使用#import YourNewTabBarController.h)

3)在MainWindow.xib更改类的标签栏控制器到您的新类。

普雷斯托!

PS: YourNewTabBarController应该实现的是shouldAutoRotate ....删除所有其他(自动生成)的东西。



文章来源: Selective Autorotation within a UINavigationController and UITabBarController