首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在iOS 8中强制视图控制器方向?

如何在iOS 8中强制视图控制器方向?
EN

Stack Overflow用户
提问于 2014-10-14 17:26:50
回答 25查看 154.1K关注 0票数 153

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

代码语言:javascript
复制
[[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开始应该始终避免这种方法。

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

  1. First视图控制器-它应该支持iPad中的所有方向,并且只支持conditions
  2. Third视图控制器中的纵向(按下主页按钮)-它应该在所有conditions
  3. Third视图控制器中只支持横向权限-它应该在所有条件下仅支持横向权限

我们正在使用导航控制器进行页面导航。从第一个视图控制器,在一个按钮单击动作上,我们将第二个推入堆栈。因此,当第二个视图控制器到达时,无论设备方向如何,应用程序应该只锁定在横向方向。

下面是我在第二个和第三个视图控制器中的shouldAutorotatesupportedInterfaceOrientations方法。

代码语言:javascript
复制
-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscapeRight;
}

-(BOOL)shouldAutorotate {
    return NO;
}

在iOS 8的特定方向上,有没有更好的锁定视图控制器的方法。请帮助!!

EN

回答 25

Stack Overflow用户

回答已采纳

发布于 2014-10-14 18:11:44

对于iOS 7- 10:

Objective-C:

代码语言:javascript
复制
[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeLeft) forKey:@"orientation"];
[UINavigationController attemptRotationToDeviceOrientation];

Swift 3:

代码语言:javascript
复制
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()

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

票数 321
EN

Stack Overflow用户

发布于 2015-01-30 01:13:03

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

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

赋予视图控制器强大的功能!

Swift 2.3

代码语言:javascript
复制
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

代码语言:javascript
复制
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中指定的默认方向行为

禁用旋转

代码语言:javascript
复制
class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }
}

锁定到特定方向

代码语言:javascript
复制
class ViewController: UIViewController {
    override func supportedInterfaceOrientations() -> Int {
        return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }
}

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

Lock Screen Rotation

票数 95
EN

Stack Overflow用户

发布于 2015-03-19 00:52:40

这是对我有效的方法:

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

在你的viewDidAppear:方法中调用它。

代码语言:javascript
复制
- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [UIViewController attemptRotationToDeviceOrientation];
}
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26357162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档