iOS 11 设备方向自动转向

8
对于iOS 10及以下版本,以下代码控制了任何相关的UIViewController的方向。我已在我的部署信息中选择了竖屏、左横屏和右横屏,并在我的Info.plist中添加了以下内容:

enter image description here

对于我的VC,它们应该完全不旋转,我有以下代码,我已经声明,在iOS 11之前是有效的。
- (BOOL)shouldAutorotate {
    [super shouldAutorotate];
    return NO;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    [super supportedInterfaceOrientations];
    return UIInterfaceOrientationMaskPortrait;
}

我已经在实际设备上测试过了,截至iOS 11,它不起作用。
更奇怪的是,在iOS 11上记录注册设备方向时告诉我该设备处于竖屏状态...当控制器以横屏模式加载时...
代码:
// In viewDidLoad 
NSLog(@"orientation: %lu", [[UIDevice currentDevice] orientation]);

控制台输出:

2017-09-22 15:20:26.225196-0400 <APP_NAME>[2669:1628408] orientation: 1

在构建和运行应用程序之前,将设备向左或向右旋转即可发生此情况。


  • 这里出现错误的原因是什么?如果有人知道,请帮忙解决。

FYI: 不,我的设备没有旋转锁定。
1个回答

6

无论这是否证明为一个的 bug,我似乎已经偶然发现了一个“解决”此问题的方法。出于某种原因,对于,将- (BOOL)shouldAutorotate的返回值更改为YES可以允许正确的屏幕方向...

Objc

- (BOOL)shouldAutorotate {

    [super shouldAutorotate];
    
    if (@available(iOS 11, *)) return YES;
    return NO;

}

在这种情况下,我需要手动检查屏幕尺寸,以确定宽度是否大于或小于屏幕预定的高度。

width = self.view.frame.size.width, height = self.view.frame.size.height;
if (height < width) width = height, height = self.view.frame.size.width;

希望有其他人能找到这个“bug”的真正原因或者Apple更新他们的捆绑包来处理所有以前iOS版本的旋转.

Swift 3.2+

override var shouldAutorotate: Bool {

    if #available(iOS 11.0, *) {
        // Anything else iOS 11 specific
        return true
    } 
    return false

}

2
在iOS 11.2上,(BOOL)shouldAutorotate {}根本没有被调用。无论是在根视图控制器中还是在后续的视图控制器中都没有被调用。 - RickJansen
如果您的VC没有调用,请创建一个导航控制器并在那里调用此方法 - https://dev59.com/K1kS5IYBdhLWcg3wECyU - Will Von Ullrich
我发现在iOS 11中,除非我在我的UIApplicationDelegate类中实现了application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)方法,否则不会调用这些方法。 - Beltalowda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接