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

如何在iOS 8中强制查看控制器方向?

丌官晔
2023-03-14

在iOS 8之前,我们将以下代码与supportedInterfaceOrientations和shouldAutoRotate委托方法结合使用,以强制应用程序定向到任何特定的方向。我使用下面的代码片段以编程方式将应用程序旋转到所需的方向。首先,我正在更改状态栏的方向。然后,仅显示并立即取消模式视图即可将视图旋转到所需的方向。

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

但这在iOS 8中是失败的。此外,我在stack overflow中看到了一些答案,人们建议从iOS 8开始,我们应该始终避免这种方法。

更具体地说,我的应用程序是一种通用类型的应用程序。共有三个控制器。

>

  • 第一视图控制器-它应该支持iPad中的所有方向,并且在iPhone中只支持纵向(主页按钮向下)。

    第二视图控制器-在所有条件下,它应仅支持横向视图

    第三视图控制器-在所有条件下,它应仅支持横向视图

    我们正在使用导航控制器进行页面导航。在第一个视图控制器上,在一个按钮单击操作上,我们正在堆栈上按下第二个。因此,当第二个视图控制器到达时,无论设备方向如何,应用程序都应仅锁定在横向右侧。

    下面是我的在第二个和第三个视图控制器中应该Autorotate支持的InterfaceOrientationshtml" target="_blank">方法。

    -(NSUInteger)supportedInterfaceOrientations{
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    
    -(BOOL)shouldAutorotate {
        return NO;
    }
    

    是否有任何解决方案或更好的方法锁定iOS 8特定方向的视图控制器。请帮忙!!

  • 共有3个答案

    童花蜂
    2023-03-14

    这就是我的工作原理:

    https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation

    在您的视图中调用它diddispect:method。

    - (void) viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        [UIViewController attemptRotationToDeviceOrientation];
    }
    
    归鸿朗
    2023-03-14

    如果您在UINavigationController或UITabBarController中,方向旋转会稍微复杂一些。问题是,如果视图控制器嵌入其中一个控制器中,则导航或选项卡栏控制器优先,并决定自动旋转和支持的方向。

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

    Swift 2.3

    extension UINavigationController {
        public override func supportedInterfaceOrientations() -> Int {
            return visibleViewController.supportedInterfaceOrientations()
        }
        public override func shouldAutorotate() -> Bool {
            return visibleViewController.shouldAutorotate()
        }
    }
    
    extension UITabBarController {
        public override func supportedInterfaceOrientations() -> Int {
            if let selected = selectedViewController {
                return selected.supportedInterfaceOrientations()
            }
            return super.supportedInterfaceOrientations()
        }
        public override func shouldAutorotate() -> Bool {
            if let selected = selectedViewController {
                return selected.shouldAutorotate()
            }
            return super.shouldAutorotate()
        }
    }
    

    雨燕3

    extension UINavigationController {
        open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
            return visibleViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
        }
    
        open override var shouldAutorotate: Bool {
            return visibleViewController?.shouldAutorotate ?? super.shouldAutorotate
        }
    }
    
    extension UITabBarController {
        open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
            if let selected = selectedViewController {
                return selected.supportedInterfaceOrientations
            }
            return super.supportedInterfaceOrientations
        }
    
        open override var shouldAutorotate: Bool {
            if let selected = selectedViewController {
                return selected.shouldAutorotate
            }
            return super.shouldAutorotate
        }
    }
    

    现在,您可以重写supportedInterfaceOrientations方法,也可以重写要锁定的视图控制器中的shouldAutoRotate方法,否则,您可以在其他视图控制器中省略要继承应用程序列表中指定的默认方向行为的重写

    class ViewController: UIViewController {
        override func shouldAutorotate() -> Bool {
            return false
        }
    }
    
    class ViewController: UIViewController {
        override func supportedInterfaceOrientations() -> Int {
            return Int(UIInterfaceOrientationMask.Landscape.rawValue)
        }
    }
    

    理论上,这应该适用于所有复杂的视图控制器层次结构,但我注意到UITabBarController存在一个问题。出于某种原因,它希望使用默认的方向值。如果您有兴趣了解如何解决某些问题,请参阅以下博文:

    锁定屏幕旋转

    颜楚青
    2023-03-14

    iOS7-10:

    目标C:

    [[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeLeft) forKey:@"orientation"];
    [UINavigationController attemptRotationToDeviceOrientation];
    

    Swift 3:

    let value = UIInterfaceOrientation.landscapeLeft.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
    UINavigationController.attemptRotationToDeviceOrientation()
    

    只需在所呈现的视图控制器的-viewddPresar:中调用它。

     类似资料:
    • 当存在多个时,视图解析器如何确定要加载哪个控制器。 我正在从头开始学习Spring,正如我的导师所说,我们只需要一个带有注释的控制器类。如果我有多个带有注释的类,以及如何确定要加载哪个控制器类,因为Spring是Singleton,并且只有一个控制器类存在。

    • 我是AWS Kinesis的新手。我正在尝试使用KCL版本1(按照这里的亚马逊说明:https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-implementation-app-java.html#kcl-java-interface-original) 我想初始化一个新的KCL实例,但我不知道我的碎片ID是什

    • 给出了一种Spring-MVC控制器的方法: 如果请求URL中缺少参数,则报告一个错误,例如: JBWeb000068:message Required int参数“param1”不存在 如果省略,则可以执行此操作,但问题是,如果缺少参数,则不会报告任何错误。另一方面,如果包含,则在GET请求中需要一个名为“model”的参数。有没有一种方法可以使模型参数成为强制性的,同时保持相同的请求URL?

    • 问题内容: 我正在做一个MVC应用程序,我需要从控制器传递json对象才能查看。 上面的代码是我在控制器中使用的,现在当我部署视图页面时,在浏览器中打开一个下载对话框,打开文件时,它会为我提供json对象作为我需要的格式。 现在我想返回我的视图页面,也想访问视图页面中的json对象。我怎样才能做到这一点。 问题答案: 在执行此操作时,您明确地告诉MVC 不要使用view 并提供序列化的JSON数据

    • spring.jpa.properties.hibernate.show_sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.use_sql_comments=true

    • 本文向大家介绍hibernate 中如何在控制台查看打印的 SQL 语句?相关面试题,主要包含被问及hibernate 中如何在控制台查看打印的 SQL 语句?时的应答技巧和注意事项,需要的朋友参考一下 在 Config 里面把 hibernate. show_SQL 设置为 true 就可以。但不建议开启,开启之后会降低程序的运行效率。