App如何在特定页面实现横屏(源码)

所在公司为金融行业,设计的App需要在展示股票走势图像的页面实现横屏,而其他页面不支持横屏.在网上看了翻了好久,也没有比较明白的文章.结合自己的工程,记录如下.
有两种实现实现横屏的方法.比较简单的一种是直接修改该页面View的frame.

self.view.transform = self.view.transform.rotated(by: CGFloat(M_PI))

实现后,再对各个子控件的frame进行设置.但是当控件过多时,实现就会十分麻烦(相信用Frame进行布局的童鞋都深有体会).
Xcode中提供了SizeClasses,用相对布局的方式,很方便的实现横竖屏的切换.所以第二种方法核心就是调用原生的SizeClasses方法.
步骤:
1设置如图.此处设置对整个App页面有效,如果此处不支持LandscapeLeft,则在下面步骤中的设置页面方法失效.


App如何在特定页面实现横屏(源码)_第1张图片
Snip20161110_2.png

2在UITabBarController中重写方法:

    override var shouldAutorotate: Bool{
//需要实现横屏的子页面
        let item = NSClassFromString("AppSwift.GXGoodsDetailController")
        for nav in self.viewControllers! {
            let customNav = (nav as! GXNavigationViewController).topViewController!
            if customNav.isKind(of: item!)  {
                return customNav.shouldAutorotate
            }
        }
        return false
    }

3在需要实现子页面重写方法:

var rotateFlag: Bool = false   
 override var shouldAutorotate: Bool{
        return self.rotateFlag
    }

4设置横屏:

func rotateBtnClick(_ sender: AnyObject) {
        self.rotateFlag = true
        UIDevice.current.setValue(UIDeviceOrientation.landscapeLeft.rawValue, forKey: "orientation")
        self.rotateFlag = false
        self.isScreenLeft = true
    }

其中rotateFlag为true时,用KVC对orientation属性设置有效;当rotateFlag为false时,失效.
总结一下:
App旋转屏幕时都会调用UITabBarController中的shouldAutorotate方法.当返回true时,对UIDeviec的orientation属性,设置在Target下支持的屏幕方向(上图中的Landscape Left)就会生效.反之,无效.
如果有更好的方式或者疑问,欢迎留言交流.

你可能感兴趣的:(App如何在特定页面实现横屏(源码))