【问题标题】:Understanding iOS 6 Interface orientation change了解 iOS 6 界面方向变化
【发布时间】:2023-04-26 10:57:01
【问题描述】:

添加: 我看到我的问题经常在没有人赞成的情况下被查看,所以我决定你们没有得到你搜索的内容。将您重定向到具有非常好的答案的问题 How to handle orientation changes in iOS6

对方向变化的具体要求: Restricted rotation

欢迎投票 :)


我从 Master Detail 模板创建了一个新项目,并尝试以横向启动它。 众所周知,

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

方法已弃用,我们必须使用

- (NSUInteger)supportedInterfaceOrientations

和/或

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

这是我的代码:

- (NSUInteger)supportedInterfaceOrientations {
    NSLog(@"supported called");
    return UIInterfaceOrientationMaskAll;//Which is actually a default value
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    NSLog(@" preferred called");//This method is never called. WHY?
    return UIInterfaceOrientationLandscapeRight;
}

如您所见,我正在尝试以首选方法返回横向,但它从未被调用。 p.s.文档状态:

讨论 系统在展示视图时调用该方法 控制器全屏。您在查看时实现此方法 控制器支持两个或多个方向但内容出现 在这些方向之一中表现最好。

如果你的视图控制器实现了这个方法,那么当出现时, 它的视图以首选方向显示(尽管稍后可以 旋转到另一个支持的旋转)。如果不实施 这种方法,系统使用当前的视图控制器呈现 状态栏的方向。

所以,问题是:为什么 prefferredOrientation 方法永远不会被调用?以及我们应该如何处理不同控制器中的不同方向?谢谢! PS不要将问题标记为重复。我调查了所有类似的问题,但他们没有我的答案。

【问题讨论】:

  • 您可以按照 Apple 的教程获取相同的 Supporting Multiple Interface Orientations 希望这会对您有所帮助。
  • 来自您的链接:“当视图控制器呈现在根视图控制器上时,系统行为会以两种方式发生变化。首先,在确定是否使用呈现的视图控制器而不是根视图控制器时"这就是我正在做的......或者我只是不明白他们......请详细解释......

标签: iphone objective-c ios6 uiinterfaceorientation


【解决方案1】:

关于preferredInterfaceOrientationForPresentation

preferredInterfaceOrientationForPresentation 永远不会被调用,因为这不是“呈现”的视图控制器。这里不涉及“演示”。

“Presented”和“presentation”并不是一些模糊的术语,意思是“出现”。这些是精确的技术术语,意味着这个视图控制器是通过调用presentViewController:animated:completion: 发挥作用的。换句话说,只有当这就是我们过去所说的“模态”视图控制器时,这个事件才会到达。

好吧,您的视图控制器不是模态视图控制器;它没有presentViewController:animated:completion: 一起使用。所以不涉及“演示”,因此preferredInterfaceOrientationForPresentation 在这里无关紧要。

我对此非常明确,因为我认为许多人会像您一样感到困惑或被误导。所以也许这篇笔记会对他们有所帮助。

进入横向

在 iOS 6 中,Info.plist 中的“支持的界面方向”键比以前更受重视。启动所需方向的整体问题的解决方案是:

  1. 确保 Info.plist 中的“支持的界面方向”列出了您的应用将永远允许采用的所有方向。

  2. 确保所需的启动方向是“支持的界面方向”中的第一个

仅此而已。实际上,您不必将任何代码放入根视图控制器来管理初始方向。

【讨论】:

  • @GeorgeAsda 是的。你觉得什么行不通?实际上,它在 iOS 8 中比以往任何时候都更加重要。从 iOS 8 首次问世开始,请在此处查看我的问题和答案:*.com/questions/24463543/…
  • @matt 在 iOS8 中,我假设 iOS9 没有办法强制以横向模式启动,然后支持所有方向。无论 .plist 中的顺序是什么,应用程序仍会启动,但用户拿着设备
  • @GeorgeAsda “没有办法强制以横向模式启动,然后支持所有方向。”就在这里。这正是我的回答所描述的。我有可以做到这一点的应用程序;我知道它有效。
  • @matt 以及您的说明:“解决您启动所需方向的整体问题的方法是:确保 Info.plist 中的“支持的界面方向”列出了您的应用程序将永远存在的所有方向"不工作
  • @GeorgeAsda 我刚刚告诉过你,它确实有效,而且我有应用程序可以做到这一点。如果做错了,那就是做错了。这不会使 my 回答错误。
【解决方案2】:

如果您想在横向模式下启动模态视图,只需将此代码放入呈现的视图控制器中

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsLandscape(orient)) {
        return orient;
    }

    return UIInterfaceOrientationLandscapeLeft;
}

然后,像往常一样展示这个控制器

UIViewController *vc = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[vc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self.navigationController presentViewController:vc animated:YES completion:^{}];

【讨论】:

    【解决方案3】:

    有一个非常简单的答案:您只能更改或修复模态呈现视图控制器的界面方向。如果您这样做,即在界面构建器(或导航控制器方法)中使用 Present Modally segue,您可以使用

    定义允许的方向
    - (NSUInteger)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
    }
    

    当您只在导航控制器上按下视图控制器时,此事件不会触发...所以:您没有返回按钮,需要一个

    [self dismissViewControllerAnimated:YES completion: ^(void) {
    
        }];
    

    关闭它。

    【讨论】: