横向 IOS 应用程序在呈现模态视图控制器时抛出异常

Posted

技术标签:

【中文标题】横向 IOS 应用程序在呈现模态视图控制器时抛出异常【英文标题】:Landscape IOS app throws exception when presenting modal viewController 【发布时间】:2015-02-12 18:19:48 【问题描述】:

作为参考,我正在使用 Xcode 6.1 并针对 ios 7.1。 看起来有类似问题的帖子,但这些建议对我不起作用。 我有一个应用程序,我设计为只能在横向模式下工作。所以我将项目设置为仅支持横向右和横向左方向。 但是当我想在我的代码中展示一个新的 viewController 时,应用程序会抛出一个异常并在下面代码中的“presentViewController”语句处崩溃:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    PhotoViewController *photoVC = [storyboard
                                  instantiateViewControllerWithIdentifier:@"PhotoViewController"];
    // Configure the new view controller here.

    //photoVC.view.frame = CGRectMake(0,0,self.view.bounds.size.width, self.view.bounds.size.height);

    photoVC.view.frame = CGRectMake(0,0,568, 320);

    [self presentViewController:photoVC animated:YES completion:nil];

顺便说一下,为了测试目的,我硬连线了 568 和 320 的宽度和高度。

错误信息说:

未捕获的异常'NSInternalInconsistencyException',原因:'自动布局>不支持使用边缘布局的交叉旋转边界变换>约束,例如右、左、上、下。令人反感的观点是: UITransitionView: 0x1701fa700;帧 = (-2.84217e-14 0; 320 568);变换 = [0, -1, 1, 0, 0, 0];

我不明白的一件事是为什么错误消息中的“框架”显示宽度为 320,高度显示为 568,当“presentViewController”传递一个视图控制器时,框架设置为横向模式(宽度 = 568,高度=320) 。 该错误消息还抱怨“越过旋转边界变换”,这是 viewController 的视图正在旋转的哪种暗示?

知道有什么问题吗?

谢谢

【问题讨论】:

您的PhotoViewController 是否实际上设置为仅允许横向,或者您是否严格依赖设置框架来为您执行此操作(提示:不会)? 根据 ViewController Programming Guide,当您在应用程序级别指定应用程序支持特定方向时,此选择适用于应用程序中的所有视图控制器。它说:“如果您限制应用程序支持的方向,那么这些限制将全局应用于所有应用程序的视图控制器,”但我还在 PhotoViewController 中包含了“supportedInterfaceOrientations”以指定它支持左右横向,但是错误还是一样 您是否尝试过不明确设置框架并让系统为您执行此操作? 是的,我仍然遇到同样的问题。 【参考方案1】:

经过反复试验,我发现将“setTranslatesAutoresizingMaskIntoConstraints”设置为 NO 会导致问题。我在呈现的 ViewController 的 viewDidLoad 中使用了它:

[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];

所以我删除了这个声明。 我使用这个语句来确保在 Interface Builders 创建的自动布局约束和我以编程方式添加的自动布局约束之间不会有约束冲突。 因此,当我删除该语句时,我当然会遇到约束冲突,但是我通过为每个存在约束冲突的子视图“删除”viewDidLoad 中的现有约束来消除它们。 顺便说一句,我的程序约束在“updateViewConstraints”中被调用

我不完全明白为什么将 setTranslatesAutoresizingMaskIntoConstraints 设置为 NO 会导致无法以模态方式呈现新 viewController 的问题,但我的猜测是系统需要以某种方式将“setTranslatesAutoresizingMaskIntoConstraints”设置为 YES 才能自动计算呈现 viewController 的方向和大小。

【讨论】:

以上是关于横向 IOS 应用程序在呈现模态视图控制器时抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

横向模式下的导航控制器堆栈,但总是以纵向帧大小模态呈现视图控制器视图

在 IOS 6 中使用情节提要以横向模式呈现 modalViewController

iOS 模式弹出框横向定位错误?

应用程序试图在目标上呈现一个 nil 模态视图控制器

iOS UISearchController 崩溃:应用程序试图在自身上呈现模态视图控制器

ios:应用程序试图在目标上呈现一个 nil 模态视图控制器