理解iOS 6界面方向变化

23

补充: 我发现我的问题经常被查看但没有投票,所以我决定你们没有得到你们想要的答案。我将重定向您到一个真正提供了有关如何处理iOS6中方向更改的好答案的问题: 如何在iOS6中处理方向更改

对方向更改的具体要求如下: 限制旋转

欢迎点赞 :)


我从“主细节”模板创建了一个新项目,并尝试以横向方向开始它。 如您所知,

- (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;
}

如您所见,我正在尝试返回首选方向的横向模式,但它从未被调用。 附:文档说明:

讨论 当视图控制器以全屏方式呈现时,系统将调用此方法。在您的视图控制器支持两个或更多方向但内容最适合其中一种方向时,您需要实现此方法。

如果您的视图控制器实现了此方法,则当呈现其视图时,该视图会显示为首选方向(虽然稍后可以将其旋转到另一个支持的方向)。如果您没有实现此方法,则系统使用状态栏当前的方向呈现视图控制器。

因此,问题是:为什么prefferredOrientation方法从未被调用?我们应该如何处理不同控制器的方向?谢谢! 备注:请勿将此问题标记为重复。我已经研究了所有类似的问题,但它们没有我的答案。


1
你可以参考苹果公司的教程 支持多个界面方向。希望这能对你有所帮助。 - Kamleshwar
从您的链接中:当一个视图控制器被呈现在根视图控制器之上时,系统行为会发生两种变化。首先,在确定是否支持方向时,使用呈现的视图控制器而不是根视图控制器。其次,呈现的视图控制器还可以提供首选方向。如果视图控制器以全屏方式呈现,则用户界面将以首选方向呈现。 这就是我正在做的事情...或者我只是没有理解它们...请详细解释一下。 - Stas
3个回答

34

关于preferredInterfaceOrientationForPresentation

preferredInterfaceOrientationForPresentation方法从未被调用,因为这不是一个“presented”视图控制器。这里没有涉及“presentation”。

“Presented”和“presentation”并不是一些模糊的意味着“显示”的术语。这些是精确的技术术语,意味着使用presentViewController:animated:completion:调用将此视图控制器引入到播放中。换句话说,只有当我们所说的“模态”视图控制器才会出现这种情况。

好吧,你的视图控制器不是一个模式视图控制器;它不是用presentViewController:animated:completion:调用引入的。因此这里没有任何“presentation”,因此preferredInterfaceOrientationForPresentation在这里是无关紧要的。

我非常明确地说这点,因为我认为许多人会像你一样感到困惑或被误导。因此,也许这个注释将帮助他们。

启动时进入横屏

在iOS 6中,“Info.plist”文件中的“Supported Interface Orientations”键比以前更加严格。解决您启动时进入所需方向的整体问题的方法是:

  1. 确保“Info.plist”中的“Supported Interface Orientations”列出了您的应用程序将允许假定的所有方向。

  2. 确保所需的启动方向是“Supported Interface Orientations”中的第一个。

就是这样。实际上,您不需要在根视图控制器中放置任何代码来管理初始方向。


@GeorgeAsda 是的,它可以。你认为哪里出了问题?实际上,在iOS 8中比以往任何时候都更加重要。请参见我在iOS 8首次推出时发布的问题和答案:https://dev59.com/nWAf5IYBdhLWcg3wnDsI - matt
在iOS8中,我认为到iOS9为止,没有办法强制启动横屏模式,然后支持所有方向。无论在.plist中的顺序如何,应用程序仍会启动,但用户握持设备的方式不同。 - George Asda
@GeorgeAsda "没有办法强制启动在横向模式,然后支持所有方向。" 是的,有办法。这正是我的答案描述如何实现的。我有应用程序可以完全做到这一点;我知道它是可行的。 - matt
@matt,你的指示如下: “解决启动到所需方向的整体问题的方法是: 确保 Info.plist 中的“支持的界面方向”列出了应用程序将允许假定的所有方向。 确保所需的启动方向在“支持的界面方向”中排名第一。 就这样。实际上,您不需要将任何代码放入根视图控制器中来管理初始方向。” 这并不起作用。 - George Asda
@GeorgeAsda 我刚告诉过你,它确实可行,并且我有应用程序可以做到这一点。如果是你做错了什么,那就是你自己的问题。这并不意味着我的回答是错的。 - matt

8
如果您想在横屏模式下启动模态视图,请将以下代码放入呈现的视图控制器中。
- (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:^{}];

0

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

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
}

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

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

关闭它。


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