Swift - 实现整体竖屏显示,而部分页面强制横屏(或自动横竖屏)
作者:hangge | 2018-10-19 08:13
默认情况下,App 会根据屏幕旋转方向,自动切换成横屏或竖屏显示。如果想让 App 在任何情况下都强制横屏、或者竖屏显示,只需修改项目的“Device Orientation”配置项即可,这个可以参考我之前写的文章:
(2)ViewController.swift(主页面)
(4)DetailViewController2.swift(详情页2)
(2)如果部分页面允许横竖屏切换可以这么写:
(3)如果部分页面需要强制竖屏可以这么写:
但这样设置后所有的页面都统一变成固定横屏或竖屏,而有的时候我们需要实现不同页面使用不同的效果,比如:
- 整体竖屏显示,部分页面允许横竖屏切换(或强制横屏)
- 整体横屏显示,部分页面允许横竖屏切换(或强制竖屏)
下面通过样例演示这个功能如何实现。
一、准备工作
(1)首先样例 Demo 中有如下 3 个视图控制器,点击主视图控制器的按钮可以分别跳转到后两者上:
- ViewController.swift:主视图控制器
- DetailViewController1.swift:详情页1视图控制器
- DetailViewController2.swift:详情页2视图控制器
(2)默认情况下不做任何设置的话,这三个页面都是可以随着屏幕旋转方向改变,自动变成横屏或竖屏显示。
二、整体竖屏显示,部分页面允许横竖屏切换(或强制横屏)
1,效果图
(1)“首页”为默认的强制竖屏,任何情况下界面都是竖屏显示。
(2)“详情页1”为自动切换,会根据设备旋转方向自动变成横屏或者竖屏显示。
(3)“详情2”为强制横屏,任何情况下界面都是横屏显示。
2,样例代码
(1)AppDelegate.swift
- 在这里增加一个变量 interfaceOrientations 表示当前支持的横竖屏方向(后面那些需要特殊处理的部分页面中会改变这个值)。
- 而 supportedInterfaceOrientationsFor 这个代理方法则返回当前支持的方向。
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? //当前界面支持的方向(默认情况下只能竖屏,不能横屏显示) var interfaceOrientations:UIInterfaceOrientationMask = .portrait{ didSet{ //强制设置成竖屏 if interfaceOrientations == .portrait{ UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") } //强制设置成横屏 else if !interfaceOrientations.contains(.portrait){ UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation") } } } //返回当前界面支持的旋转方向 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)-> UIInterfaceOrientationMask { return interfaceOrientations } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { return true } func applicationWillResignActive(_ application: UIApplication) { } func applicationDidEnterBackground(_ application: UIApplication) { } func applicationWillEnterForeground(_ application: UIApplication) { } func applicationDidBecomeActive(_ application: UIApplication) { } func applicationWillTerminate(_ application: UIApplication) { } }
(2)ViewController.swift(主页面)
- 由于 AppDelegate 中设置了默认强制竖屏显示,那么主视图控制器这边没有什么需要修改的。
(3)DetailViewController1.swift(详情页1)
import UIKit //详情页1 class DetailViewController1: UIViewController { //获取 AppDelegate 对象 let appDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //该页面显示时可以横竖屏切换 appDelegate.interfaceOrientations = .allButUpsideDown } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //页面退出时还原强制竖屏状态 appDelegate.interfaceOrientations = .portrait } }
(4)DetailViewController2.swift(详情页2)
import UIKit //详情页2 class DetailViewController2: UIViewController { //获取 AppDelegate 对象 let appDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //该页面显示时强制横屏显示 appDelegate.interfaceOrientations = [.landscapeLeft, .landscapeRight] } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //页面退出时还原强制竖屏状态 appDelegate.interfaceOrientations = .portrait } }
附:整体横屏显示,部分页面允许横竖屏切换(或强制竖屏)
(1)如果想让页面默认情况下都是横屏显示,则只需将上面 AppDelegate.swift 代码中的 interfaceOrientations 变量的默认值做个修改即可:import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? //当前界面支持的方向(默认情况下只能横屏,不能竖屏显示) var interfaceOrientations:UIInterfaceOrientationMask = [.landscapeLeft, .landscapeRight] { didSet{ print(UIDevice.current.orientation.isLandscape) //强制设置成竖屏 if interfaceOrientations == .portrait{ UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") } //强制设置成横屏 else if !interfaceOrientations.contains(.portrait){ UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation") } } } //返回当前界面支持的旋转方向 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)-> UIInterfaceOrientationMask { return interfaceOrientations } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { return true } func applicationWillResignActive(_ application: UIApplication) { } func applicationDidEnterBackground(_ application: UIApplication) { } func applicationWillEnterForeground(_ application: UIApplication) { } func applicationDidBecomeActive(_ application: UIApplication) { } func applicationWillTerminate(_ application: UIApplication) { } }
(2)如果部分页面允许横竖屏切换可以这么写:
import UIKit //详情页1 class DetailViewController1: UIViewController { //获取 AppDelegate 对象 let appDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //该页面显示时可以横竖屏切换 appDelegate.interfaceOrientations = .allButUpsideDown } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //页面退出时还原强制横屏状态 appDelegate.interfaceOrientations = [.landscapeLeft, .landscapeRight] } }
(3)如果部分页面需要强制竖屏可以这么写:
import UIKit //详情页2 class DetailViewController2: UIViewController { //获取 AppDelegate 对象 let appDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //该页面显示时强制竖屏显示 appDelegate.interfaceOrientations = .portrait } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //页面退出时还原强制横屏状态 appDelegate.interfaceOrientations = [.landscapeLeft, .landscapeRight] } }
全部评论(1)
第二行Orientation 多写了个t
站长回复:谢谢你的提醒,现已修改。