当前位置: 首页 > 知识库问答 >
问题:

在Swift iOS中设置设备方向

谢昊乾
2023-03-14

我正在为iPhone开发一个swift应用程序。我的应用程序中有一个模态视图,我只想在纵向视图中。

我的问题是,如何通过编程强制手机不允许旋转?换句话说,我正在寻找不允许在横向模式下显示模式视图的代码(打开纵向旋转锁定)。

这只是一个模态视图,所以我不能关闭整个应用程序的旋转,否则我会完全禁用旋转。

我在这里的研究中发现了代码,但它是在目标C中,以防有所帮助。谢谢

共有3个答案

越星晖
2023-03-14

雨燕3

如果视图控制器嵌入在UINavigationController或UITabBarController中,则方向旋转会更加复杂。导航或选项卡栏控制器优先,并决定自动旋转和支持的方向。

在UINavigationController和UITabBarController上使用以下扩展,以便嵌入其中一个控制器的视图控制器能够做出决策:

UINavigationController扩展

extension UINavigationController {

override open var shouldAutorotate: Bool {
    get {
        if let visibleVC = visibleViewController {
            return visibleVC.shouldAutorotate
        }
        return super.shouldAutorotate
    }
}

override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
    get {
        if let visibleVC = visibleViewController {
            return visibleVC.preferredInterfaceOrientationForPresentation
        }
        return super.preferredInterfaceOrientationForPresentation
    }
}

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get {
        if let visibleVC = visibleViewController {
            return visibleVC.supportedInterfaceOrientations
        }
        return super.supportedInterfaceOrientations
    }
 }}

UITABBARC控制器扩展

extension UITabBarController {

override open var shouldAutorotate: Bool {
    get {
        if let selectedVC = selectedViewController{
            return selectedVC.shouldAutorotate
        }
        return super.shouldAutorotate
    }
}

override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
    get {
        if let selectedVC = selectedViewController{
            return selectedVC.preferredInterfaceOrientationForPresentation
        }
        return super.preferredInterfaceOrientationForPresentation
    }
}

override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get {
        if let selectedVC = selectedViewController{
            return selectedVC.supportedInterfaceOrientations
        }
        return super.supportedInterfaceOrientations
    }
}}

现在,您可以在要锁定的视图控制器中覆盖支持的InterfaceOrientations、应自动旋转和首选InterfaceOrientationForPresent,否则您可以忽略要继承应用程序plist中指定的默认方向行为的其他视图控制器中的覆盖。

锁定到特定方向

class YourViewController: UIViewController {
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get {
        return .portrait
    }
}}

禁用旋转

    class YourViewController: UIViewController {
open override var shouldAutorotate: Bool {
    get {
        return false
    }
}}

更改演示文稿的首选界面方向

class YourViewController: UIViewController {
open override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
    get {
        return .portrait
    }
}}
阎丰
2023-03-14

您可以在需要纵向的每个视图的ViewController中粘贴这些方法

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

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.Portrait
}
米浩穰
2023-03-14

LandscapeLeft和LandscapeRight的Hi(更新Swift 2.0)

和UIController

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

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return [UIInterfaceOrientationMask.LandscapeLeft,UIInterfaceOrientationMask.LandscapeRight]
}
override func shouldAutorotate() -> Bool {
    if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft ||
        UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight ||
        UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
            return false
    }
    else {
        return true
    }
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return [UIInterfaceOrientationMask.Portrait ,UIInterfaceOrientationMask.PortraitUpsideDown]
}

来自法国的消息,圣诞快乐!

编辑:

其他解决方案:

extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        if visibleViewController is MyViewController {
            return true   // rotation
        } else {
            return false  // no rotation
        }
    }

    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return (visibleViewController?.supportedInterfaceOrientations())!
    }
}
 类似资料:
  • 问题内容: 我正在为iPhone开发一个快速的应用程序。我的应用程序中有一个模式视图,我只想使用纵向视图。 我的问题是,如何以编程方式强制手机不允许旋转?换句话说,我正在寻找的代码不允许以横向模式显示模式视图(打开人像旋转锁定)。 这仅用于1模态视图,因此我无法关闭整个应用程序的旋转,否则我将完全禁用旋转。 我在这里的研究中找到了代码, 但如果有帮助,它在目标C中。谢谢! 问题答案: 您可以将这些

  • 我正在使用AutoLayout开发iPad应用程序,如果用户启用某个模式(“平视”模式),我希望只支持纵向(或纵向倒置)方向,而且,如果设备处于横向,我希望自动切换到纵向模式。 在顶视图控制器中,我有以下内容: 根据我在这里其他地方看到的答案,答案似乎是我应该使用“application SetStatusBaroOrientation”。因此,在用户选择“抬头”模式的方法中,我包括: 然而,这似

  • jd.startDeviceMotionListening(Object object) 开始监听设备方向的变化。 参数 Object object 属性 类型 默认值 必填 说明 interval string normal 否 监听设备方向的变化回调函数的执行频率 success function 否 接口调用成功的回调函数 fail function 否 接口调用失败的回调函数 comple

  • 是否有其他方法启用它?

  • 我是库伯内特人。我在Minikube中配置的整个设置。我不确定它是否与其他kubernetes设置有所不同。 我已经在我的设置中创建了一个POD,一个Spring Boot应用程序正在8080端口上运行,这个服务将在20080端口上向集群公开。 我正在运行tcpDum的集群内运行另一个pod。我需要在20080上转储撞击集群的HTTP数据包。请告诉我如何从tcpDumpod访问集群接口。 我尝试了

  • Meta:- IOS仿真器设备v10.3 Appium java-client V5.0.0 beta8 硒v3.4.0 实际上,我试图在设备中使用自动化设置。我尝试了以下代码,它在设备上运行良好,而在上抛出异常: 例外情况: WebDriverException:方法尚未实现(警告:服务器未提供任何stacktrace信息) 当我尝试使用JavascriptExecutor作为: Unsuppo