快速锁定某些视图的旋转

问题描述 投票:0回答:3

我将一些视图设计为横向模式,另一些视图设计为纵向模式。我的目标是防止它们旋转。具体来说,我希望横向视图保持横向,纵向视图保持纵向,而不进行任何自动旋转。

我对此进行了广泛的研究并尝试了以下方法:

override func shouldAutorotate() -> Bool {
    return false
}

并且:

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

然而,这些方法并没有达到预期的效果。有人对如何为每个视图强制执行固定方向有建议吗?

swift uiviewcontroller orientation
3个回答
1
投票

只需通过覆盖即可获得方向:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape && flag{
        let value = UIInterfaceOrientation.portrait.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")
        print("Landscape")
    } else if UIDevice.current.orientation.isPortrait && !flag {
        let value = UIInterfaceOrientation.landscapeLeft.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")
        print("Portrait")
    }
}

并做这样的事情。

此功能不会锁定您的屏幕,但会将屏幕保持在您想要的方向。


1
投票

您的方向是正确的,但是当用户处于纵向模式时,并且您想要强制用户处于横向模式,因为您的视图是横向的,您必须更改

UIDevice
方向。

UIDevice.current.setValue(UIDeviceOrientation.landscapeLeft.rawValue, forKey: "orientation")

更多 UIDevice 选项,请参阅苹果文档: https://developer.apple.com/documentation/uikit/uideviceorientation

为了确保用户无法返回纵向,您添加:(您已有的代码)

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.landscape
}

1
投票

AppDelegate

中添加此属性和函数
    internal var shouldRotate = false
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
       return shouldRotate ? .landscape : .portrait
    }

无论您想在哪里拨打此线路

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.shouldRotate = true
© www.soinside.com 2019 - 2024. All rights reserved.