为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2019-07-08 16:14:06
如何在IOS 8中强制查看控制器方向?在iOS 8之前,我们将下面的代码与支持接口定向和应自旋委托方法强制应用程序定向到任何特定方向。我使用下面的代码片段以编程方式将应用程序旋转到所需的方向。首先,我改变了状态栏的方向。然后,只要呈现并立即丢弃一个模态视图,就可以将视图旋转到所需的方向。[[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中是失败的。而且,我在堆栈溢出中看到了一些答案,人们建议我们应该从iOS 8开始始终避免这种方法。更具体地说,我的应用程序是一种通用的应用程序类型。总共有三个控制器。第一视图控制器-它应该支持iPad中的所有方向,只支持iPhone中的肖像画(主页按钮)。第二视图控制器-在任何情况下都应支持景观权第三视图控制器-在任何情况下都应支持景观权我们使用导航控制器进行页面导航。从第一个视图控制器,在一个按钮单击操作,我们推动第二个在堆栈上。因此,当第二个视图控制器到达时,不管设备的方向如何,应用程序应该只锁定在景观右侧。下面是我的shouldAutorotate和supportedInterfaceOrientations方法在第二视图控制器和第三视图控制器中。-(NSUInteger)supportedInterfaceOrientations{     return UIInterfaceOrientationMaskLandscapeRight;}-(BOOL)shouldAutorotate {     return NO;}是否有任何解决方案或任何更好的方法锁定一个视图控制器,特别是iOS 8的方向。请帮助!
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

对于IOS 7-10:

目标-C:

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

SWIFT 3:

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

打电话给我就行了- viewDidAppear:视图控制器。


查看完整回答
反对 回复 2019-07-08
?
温温酱

TA贡献1752条经验 获得超4个赞

如果您在一个UINavigationControllerUITabBarController..问题是,如果视图控制器嵌入在其中一个控制器中,导航或选项卡控制器优先,并就自动旋转和支持的方向作出决定。

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

SWIFT 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在视图控制器中,您想要锁定,否则您可以省略在其他视图控制器中的重写,您希望继承应用程序的plist中指定的默认定向行为。

禁用旋转

class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }}

锁定到特定方向

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

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

锁屏旋转


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 603 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信