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

场景需求

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

实现思路

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

image.png

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

image.png

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()
        
    }

}

效果图

Simulator Screen Recording - iPhone 14 Pro - 2023-06-08 at 16.17.22.gif

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务