Swift-iPhone、iPad 强制横屏操作怎么玩?
场景需求
在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()
}
}