shouldAutorotate调用问题

作者: gitKong | 来源:发表于2016-11-10 17:20 被阅读1152次

    一般我们的项目都是只支持竖屏的,但最近做的项目是直播的,因此我播放的时候我需要旋转屏幕切换横竖屏,所以在项目设置中需要打开横屏

    Paste_Image.png

    那么问题来了,项目中有很多个控制器,但我只要这个播放控制器可以横竖屏,其他控制器不需要,此时有两个解决办法:

    • 继承实现:如果项目是新项目,可以新建一个基类controller,重写shouldAutorotate方法,并返回NO,项目中的所有控制器都直接或者间接继承它,需要横竖屏的控制器重写它,并返回YES就可以了

    • 分类实现:如果项目已经持续一段时间,而且控制器累积很多了,此时用继承的方法就不太实际了,因此可以使用分类,新建一个UIViewController 的分类,重写shouldAutorotate方法,并返回NO,然后只需要在需要横竖屏的控制器中重写它并返回YES就行,相对继承实现,分类方便很多,因为其特性,只要拖入项目,就算不导入头文件,都会先执行分类的方法

    然后在支持横屏的控制器实现UIDeviceOrientationDidChangeNotification监听,参考我之前写的一篇简书指定控制器横屏,强制旋转屏幕就两句关键代码

    此时应该有小伙伴说shouldAutorotate方法不调用,通过实测,下面我简单总结一下出现的情况:stackoverflow上有解释

    // 跟控制器是导航控制器,那么在这个导航控制器中实现下面三个方法
    -(BOOL)shouldAutorotate {
        return [[self.viewControllers lastObject] shouldAutorotate];
    }
    
    -(NSUInteger)supportedInterfaceOrientations {
        return [[self.viewControllers lastObject] supportedInterfaceOrientations];
    }
    
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
        return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
    }
    
    // 跟控制器是tabBar控制器,那么在这个tabBar控制器中实现下面三个方法
    -(BOOL)shouldAutorotate {
        return [self.selectedViewController shouldAutorotate];
    }
    
    -(NSUInteger)supportedInterfaceOrientations {
        return [self.selectedViewController supportedInterfaceOrientations];
    }
    
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
        return [self.selectedViewController preferredInterfaceOrientationForPresentation];
    }
    
    • 如果不在跟控制器(UITabBarController 和 UINavigationController 都需要设置上面方法)中设置,那么不管你在Deployment Info勾选没勾选横屏,viewController中重写shouldAutorotate都不会调用的。
    • 如果在跟控制器中设置了上面方法,那么第一个控制器的shouldAutorotate能调用,但是往下push的控制器中的shouldAutorotate就不调用了,不管勾选没勾选横屏。
    • 不管勾选没勾选横屏,如果modal一个没有实现上面三个方法的UINavigationController控制器,那么新控制器的shouldAutorotate也是不能调用,如果model一个普通的viewController控制器中的shouldAutorotate都能调用,还有如果modal一个自定义转场的控制器,也是不能调用的,例如使用我以前写的一个模仿push&pop的modal 就不行了。。。

    至于为什么会出现上面的问题,我也没搞懂这个方法的调用时机,如果你知道,欢迎大家留言😁还是那句,欢迎大家关注我,喜欢给个like

    相关文章

      网友评论

      • 任梦RM:如果手机的旋转是打开的,我横着手机启动app,就会横屏模式,但是启动的控制器我返回no的!应该怎么调?
      • 4VZhang:横屏竖屏让我们操碎了:broken_heart:

      本文标题:shouldAutorotate调用问题

      本文链接:https://www.haomeiwen.com/subject/mkjxpttx.html