iOS开发单个页面横屏处理(swift版)

问题

iOS开发中大部分情况都是只允许竖屏的,但是偶尔几个页面需要做横屏处理(或者只能横屏)

解决方案

Applegate.swift文件中的修改

首先在AppDelegate中新增属性

    var isLandscape = false

然后给AppDelegate新增扩展


// MARK: - 是否横屏
extension AppDelegate {
    @objc(application:supportedInterfaceOrientationsForWindow:) func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if isLandscape {
            //return .landscapeRight //只允许全景模式(横屏)
            return .all //允许所有模式,手机转动会跟随转动
        }else{
            return .portrait //只能竖屏
        }
    }
}

/***
 解决iOS 9 横竖屏的问题
 This is a bug in iOS 9 that it failed to retrieve the supportedInterfaceOrientations for UIAlertController. And it seems it dropped to an infinite recursion loop in looking for the supportedInterfaceOrientations for UIAlertController
 https://stackoverflow.com/questions/31406820/uialertcontrollersupportedinterfaceorientations-was-invoked-recursively
 */
extension UIAlertController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.portrait
    }
    open override var shouldAutorotate: Bool {
        return false
    }
}

info.plist 添加

    <key>UIViewControllerBasedStatusBarAppearance</key>
    <true/>

设置好了后,接下来处理需要横屏幕的页面

需要横屏的页面BTKLineVC

// MARK: - 横屏处理
extension BTKLineVC {
    //运行页面随设备转动
    override var shouldAutorotate : Bool {
        return true
    }
    
    override func viewWillAppear(_ animated: Bool) {
        if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            //允许横屏
            appDelegate.isLandscape = true
            
            // 强制横屏打开下面两行代码即可
            //let value = UIInterfaceOrientation.landscapeRight.rawValue
            //UIDevice.current.setValue(value, forKey: "orientation")
            
        }
        super.viewWillAppear(animated)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        navigationController?.setNavigationBarHidden(false, animated: false)
        
        if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            //禁止横屏
            appDelegate.isLandscape = false
        }
        //强制为竖屏
        let value = UIInterfaceOrientation.portrait.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")
        super.viewWillDisappear(animated)
    }
    
        //下面方法是处理navgation相关的逻辑,如果控制器没有nav,省略
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        coordinator.animate(alongsideTransition: { [weak self] (context) in
            let orient = UIApplication.shared.statusBarOrientation
            switch orient {
            case .landscapeLeft, .landscapeRight:
                //横屏时禁止左拽滑出
                self?.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
                self?.navigationController?.setNavigationBarHidden(true, animated: false)
            default:
                //竖屏时允许左拽滑出
                self?.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
                self?.navigationController?.setNavigationBarHidden(false, animated: false)
            }
        })
        super.viewWillTransition(to: size, with: coordinator)
    }
}

8月3号 补充

上面处理横屏会引起一个bug,就是如果手机横屏进入(与设置方向相同),布局可能会错乱。
原因是:这里布局我是按照横屏处理的,以上处理横屏方式适用于页面跟随系统,即页面可以横屏也可以竖屏

bug解决办法

  1. 设置系统只能竖屏


    image.png
  2. 需要横屏的页面取消方向跟随系统,只允许横屏

// MARK: - 横屏处理
extension BTKLineVC {
    //运行页面随设备转动
    override open var shouldAutorotate: Bool {
        return false
    }
    //支持的方向: 右边
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscapeRight
    }
    // 优先展示的方向: 右边
    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        return .landscapeRight
    }
}

11月25号更新

在iOS13时,对于 present 的页面,需要设置取消弹框新模式 添加以下代码在viewDidLoad中即可:
modalPresentationStyle = UIModalPresentationStyle.fullScreen

备注

本文swift版本用的是swift4,如果代码异常根据版本稍作修改即可食用, 用OC的同学可以根据代码自行翻译,早用swift,脱离OC苦海。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • //去掉尾部空白 _tableView.tableFooterView = [[UIView alloc] in...
    软工官博阅读 1,078评论 0 1
  • 我偶尔会有想谈恋爱的心情。特别是在深夜。在心脏砰砰跳的时候。恰好我最近总是与凌晨三点的暮色相约。恋爱代表了太多美妙...
    Insurgentk_z阅读 152评论 0 0
  • 今天在上班路上看到一则显眼的显眼的新闻标题——《马云向马化腾和腾讯道歉,钉钉深夜致歉微信,昨天发生了什么?》,惊愕...
    肖较瘦阅读 440评论 2 1
  • 今天我们将再次进行昨天介绍过的冥想练习——打坐。请将昨天的说明再读一遍,然后按照指导练习,要牢记一点:只要你在练习...
    格锅阅读 98评论 0 0