美文网首页
特定界面横屏

特定界面横屏

作者: 山已几孑 | 来源:发表于2017-06-23 18:18 被阅读0次

    最近遇到视频的需求,里面有全屏,因此研究了一下全屏的问题,

    需求

    • 进界面的时候是竖屏
    • 进入 播放界面是竖屏
    • 播放界面中可以自动翻转

    解决方案

    其中纠结的部分就不提了,直接说解决方案吧

    需求1

    需求1的重点在于,让app支持横屏,但是进入界面的时候是竖屏
    首先,通过设置TARGETS - General - Deployment info - Device orientation 的选项为第一个

    25A3174B-677C-4531-B9E3-4C5BDC0EBC66.png

    然后在AppDelegate中添加一下代理

       func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        //设置app支持的屏幕模式
        return [.portrait, .landscapeLeft, .landscapeRight]
    }
    

    需求2

    其实就是出了播放页面外,所有页面都是竖屏
    viewController 有以下几个属性可供重写,通过重写这几个方法,来实现界面的横屏或竖屏
    @available(iOS 6.0, *) //屏幕自动翻转
    open var shouldAutorotate: Bool { get }

      @available(iOS 6.0, *) // 当前界面支持的屏幕方向
      open var supportedInterfaceOrientations: UIInterfaceOrientationMask { get }
    
      // Returns interface orientation masks.
      @available(iOS 6.0, *) //初始屏幕方向,--但是实际上看意义不大
      open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { get }
    

    经过查坑发现,VC里面重写的方法并不是都能调用,因为被NavigationController和TabbarController给拦截了,需要在NavigationController和TabbarController中添加一下方法

    如果没有用到nav或者tab,就不用重写了

    • ViewController

      override var shouldAutorotate: Bool
      {
        return true
      }
      
      override var supportedInterfaceOrientations: UIInterfaceOrientationMask
      {
        return [.portrait, .landscapeRight, .landscapeLeft]
      }
      
      override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
        {
        return .landscapeLeft
      }
      
    • NavigationController

       override var shouldAutorotate: Bool
      {
        if let top = topViewController {
            return top.shouldAutorotate
        }
        return false
      }
      
      override var supportedInterfaceOrientations: UIInterfaceOrientationMask
      {
        if let top = topViewController {
            return top.supportedInterfaceOrientations
        }
        return .portrait
      }
      
      override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation
          {
        //测试着不怎么管用,不知道为什么,
        if let top = topViewController {
            return top.preferredInterfaceOrientationForPresentation
        }
        return .portrait
      }
      
    • TabbarController

      open override var shouldAutorotate: Bool
      {
        if let vc = selectedViewController {
            return vc.shouldAutorotate
        }
        return false
      }
      
      open override var supportedInterfaceOrientations: UIInterfaceOrientationMask
      {
        if let vc = selectedViewController {
            return vc.supportedInterfaceOrientations
        }
        return .portrait
      }
      

    通过重写navtab里面的方法,调用VC里面重写的方法。

    需求3

    其实上面就已经实现了需求3的基本效果,如果再多说点,就是得加个屏幕翻转的监听,来实现刷新界面之类的操作了--!废话不多说,关门放代码:

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(onDeviceOrientationChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    func onDeviceOrientationChange()  {
        //界面方向发生变化
        let orientation = UIDevice.current.orientation
        let interfaceOrientation = UIInterfaceOrientation(rawValue: orientation.rawValue)
        
        //该去做什么就去做什么吧
    }
    

    总结-到此,该有的功能就都有了,虽然感觉极其繁琐,同样,有过谁发现更好的办法,顺便告诉我一声,不胜感激~。

    相关文章

      网友评论

          本文标题:特定界面横屏

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