在常规设置中,我允许纵向和左横屏、右横屏模式。我想关闭横屏模式。在视图控制器上,我编写了以下代码:
override func shouldAutorotate() -> Bool {
return false
}
然而,自动旋转功能在忽略此函数的情况下工作。我该如何在Swift中禁用和启用自动旋转?IOS编程
这可能是正确的代码,但不在正确的视图控制器中。例如,如果视图控制器嵌入在UINavigationController中,则导航控制器仍然可以旋转,导致视图控制器仍然旋转。这真的取决于您的具体情况。
我曾经遇到同样的问题,现在我已经解决了。
按照以下步骤操作:
info --> 自定义 iOS 目标属性 --> 支持的设备方向,然后删除 ![删除 - 横屏 (Home按钮在左边), 横屏 (Home按钮在右边), 横屏 (Home按钮在上边)][1]
这将有助于解决您的问题。
return true for the viewControllers in which you want autorotation
import UIKit
class CustomNavigationController: UINavigationController {
override func shouldAutorotate() -> Bool {
if !viewControllers.isEmpty {
// Check if this ViewController is the one you want to disable roration on
if topViewController!.isKindOfClass(ViewController) { //ViewController is the name of the topmost viewcontroller
// If true return false to disable it
return false
}
}
// Else normal rotation enabled
return true
}
}
在Josh Gafni和user3655266的回答基础上,这个概念也适用于视图控制器。
如果我们有一个UIViewController是另一个UIViewController在视图层次结构中的子级,覆盖子级的shouldAutorotate()为false可能仍然会旋转,因为它的父控制器可能仍然返回true。同样重要的是要知道,即使子VC正在显示,父级的shouldAutoRotate函数仍然会被调用。因此,控制应该在那里。
Swift 5
class ParentViewController:UIViewController{
override func shouldAutorotate() -> Bool {
// Return an array of ViewControllers that are children of the parent
let childViewControllersArray = self.children
if childViewControllersArray.count > 0 {
// Assume childVC is the ViewController you are interested in NOT allowing to rotate
let childVC = childViewControllersArray.first
if childVC is ChildViewController {
return false
}
}
return true
}
}
同样的方法也可以用来限制特定的手机方向。
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
// This function is called on the parent's controller whenever the child of this parent is trying to rotate
let childrenVCArray = self.children
if childrenVCArray.count > 0 {
// assuming the array of the first element is the current childVC
let topMostVC = childrenVCArray[0]
if topMostVC is ChildViewController {
// Assuming only allowing landscape mode
return .landscape
}
}
// Return portrait otherwise
return .portrait
}
我不确定在2021年的Swift 5中shouldAutorotate()
函数是否仍然可用。但是,我建议作为管理ViewController旋转的标准流程之一调用以下函数之一(请参见苹果开发者网站中的“处理视图旋转”部分)。例如,preferredInterfaceOrientationForPresentation