场景需求
在App页面,需求对一个单独的进行强制横屏。那么问题来了,我现在的项目自身。它仅支撑竖屏状况,那咋整呢?
完成思路
网上大多数的计划,需求咱们勾选Left or Right。 这种并不是咱们需求,它无法直接解决咱们的需求。为什么这么说呢?如图所示:
这还玩个P? 这不是增加UI的工作量么?快乐-10086
OK,本着困难总比办法多规律! 总会想出办法!
解决问题
看到Appdelegate 有这样一个署理特点:
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window API_AVAILABLE(ios(6.0)) API_UNAVAILABLE(tvos);
翻译一下:
在 AppDelegate 中完成的办法,它能够用于操控应用程序在横竖屏旋转时支撑的方向。当您的应用程序支撑多个方向或需求禁止特定的方向时,该办法会很有用。
这个办法有一个 UIInterfaceOrientationMask 类型的回来值,以指示每个窗口支撑哪些屏幕方向。您能够经过以下办法来设置支撑的方向:
- portrait:竖屏方向
- landscapeLeft:横屏方向,Home 键朝左
- landscapeRight:横屏方向, Home 键朝右
- portraitUpsideDown:倒立方向,某些设备可能不支撑此方向
例如,如果您期望您的应用程序只支撑竖屏,则能够像下面这样完成该办法:
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window {
return UIInterfaceOrientationMaskPortrait;
}
如果您需求让应用程序支撑横屏和竖屏,除了 UIInterfaceOrientationMaskPortrait
外,还能够回来其他选项,如 UIInterfaceOrientationMaskLandscapeLeft
和 UIInterfaceOrientationMaskLandscapeRight
。
需求留意的是,此办法设置的仅是支撑的屏幕方向,设备旋转时实际的屏幕方向仍受用户设备设置、当时视图操控器中 shouldAutorotate
和 preferredInterfaceOrientationForPresentation
等因素所影响,实际效果可能会与您预期的略有差异。
该办法仅适用于 iOS 6.0 及今后的体系,且不适用于 tvOS 渠道。
上源代码
Appdelegate 配置
已然,此署理办法能够完成需求。那么咱们就开整!设置一个全局变量,用来记载当时Appdelegate是否全屏。备注:当然存储布尔值的办法不限,也能够经过 NSUserDefaults 的办法进行存储。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var isForceLandscape: Bool = false
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow.init(frame: UIScreen.main.bounds)
window?.backgroundColor = UIColor.white
window?.rootViewController = UINavigationController.init(rootViewController: ViewController.init())
window?.makeKeyAndVisible()
return true
}
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if (isForceLandscape) {
//这里设置答应横屏的类型
return .landscapeRight
}else{
return .portrait
}
}
}
调用办法
本文只是示例,所以代码风格比较草率。可根据实际需求,放在基类中运用。
import UIKit
class ViewController: UIViewController {
var countIndex = 1
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
self.title = "12123"
let goBtn = UIButton.init(frame: CGRect.init(x: 100, y: 200, width: 200, height: 80))
goBtn.backgroundColor = UIColor.black
goBtn.setTitle("go", for: .normal)
goBtn.addTarget(self, action: #selector(goBtnClicked), for: .touchUpInside)
self.view.addSubview(goBtn)
}
@objc func goBtnClicked() {
if (countIndex%2 == 1) {
// 强制横屏
forceOrientationLandscape()
}else{
// 强制竖屏
forceOrientationPortrait()
}
countIndex+=1
}
///强制横屏
func forceOrientationLandscape() {
let appdelegate = UIApplication.shared.delegate as? AppDelegate
appdelegate?.isForceLandscape = true
//强制翻转屏幕,Home键在右边。
UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: "orientation")
//改写
UIViewController.attemptRotationToDeviceOrientation()
}
///强制竖屏
func forceOrientationPortrait() {
let appdelegate = UIApplication.shared.delegate as? AppDelegate
appdelegate?.isForceLandscape = false
//强制翻转屏幕,Home键在右边。
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
//改写
UIViewController.attemptRotationToDeviceOrientation()
}
}
效果图