场景需求

在App页面,需求对一个单独的进行强制横屏。那么问题来了,我现在的项目自身。它仅支撑竖屏状况,那咋整呢?

完成思路

网上大多数的计划,需求咱们勾选Left or Right。 这种并不是咱们需求,它无法直接解决咱们的需求。为什么这么说呢?如图所示:

Swift-iPhone、iPad 强制横屏操作怎么玩?

这还玩个P? 这不是增加UI的工作量么?快乐-10086

Swift-iPhone、iPad 强制横屏操作怎么玩?

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 外,还能够回来其他选项,如 UIInterfaceOrientationMaskLandscapeLeftUIInterfaceOrientationMaskLandscapeRight

需求留意的是,此办法设置的仅是支撑的屏幕方向,设备旋转时实际的屏幕方向仍受用户设备设置、当时视图操控器中 shouldAutorotatepreferredInterfaceOrientationForPresentation 等因素所影响,实际效果可能会与您预期的略有差异。

该办法仅适用于 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()
  }
}

效果图

Swift-iPhone、iPad 强制横屏操作怎么玩?