美文网首页
关于iOS屏幕旋转

关于iOS屏幕旋转

作者: 携一两本单色书来 | 来源:发表于2021-03-03 12:05 被阅读0次

在iOS开发中,最常见的屏幕旋转方案:

  1. 取消Device Orientation的选择按钮


    取消选中
  2. 在appDelegate中实现全部允许旋转:

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return .allButUpsideDown
    }
  1. TabbarController中实现:

override var shouldAutorotate: Bool {

        return self.selectedViewController!.shouldAutorotate

    }



override var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return self.selectedViewController!.supportedInterfaceOrientations

    }

  1. 自定义NavigationController中实现:

这里注意区分visibleViewController 与topViewController,
visibleViewController 是当前显示的控制器
topViewController 是导航栈的栈控制器
visibleViewController跟导航栈没有关系,只是当前显示的控制器,也就是说任意一个导航的visibleViewController所返回的值应该是一样的,
topViewController 是某个导航栈的栈顶视图,和Nav控制器相关

换句话说如果在仅有一个导航栈上,visibleViewController和topViewController应该是没有区别得,

但是假如是present之后的Controller, visibleViewController和topViewController就有区别了
比如在navA.a .present->navB.b

  • navA.topViewController == a;
  • navA.visibleViewController == b;
  • navB.topViewController == b;
  • navB.visibleViewController == b;

但是假如说navA.a .present->Controllerb

  • navA.topViewController == a,
  • navA.visibleViewController == b,
  • b.nav == nil;

所以这里建议使用topViewController

override var shouldAutorotate: Bool {
        return self.topViewController!.shouldAutorotate
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if self.topViewController != nil {
            return self.topViewController!.supportedInterfaceOrientations
        } else {
            return .portrait
        }
        
    }
  1. 在BaseViewController中实现:
override var shouldAutorotate: Bool {
        return false
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }

6.在需要实现横竖屏旋转(比如播放器),在controller中override这两个方法

override var shouldAutorotate: Bool {
        
        if playerView.isHidden == true {
            return false
        } else  {
            return !isLock
        }
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if isLock == true {
            return .landscapeRight
        } else {
            return UIInterfaceOrientationMask(rawValue: UIInterfaceOrientationMask.portrait.rawValue | UIInterfaceOrientationMask.landscapeRight.rawValue | UIInterfaceOrientationMask.landscapeLeft.rawValue)
        }
    }

相关文章

网友评论

      本文标题:关于iOS屏幕旋转

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