自动布局和子视图

28

我正在使用苹果提供的iAd套件和storyboard,参考了这个链接:Apple iAd Storyboard文档

当我打开自动布局后,一切正常,但在运行时崩溃。我得到的输出结果是:

2013-08-24 12:06:36.138 TabbedBanner[7272:c07] * 在 -[UIView layoutSublayersOfLayer:] 中的断言失败,/SourceCache/UIKit_Sim/UIKit-2380.17/UIView.m:5781 2013-08-24 12:06:36.139 TabbedBanner[7272:c07] * 终止应用程序,由于未捕获的异常 'NSInternalInconsistencyException',原因是:'在向视图控制器发送 -viewDidLayoutSubviews 后仍需要自动布局。BannerViewController 的实现需要向视图发送 -layoutSubviews 方法以调用自动布局。' *** 第一个抛出的堆栈: (0x1e27012 0x110ee7e 0x1e26e78 0xba4665 0xa347a 0x11226b0 0x1358fc0 0x134d33c 0x1358eaf 0x1422bd 0x8ab56 0x8966f 0x89589 0x887e4 0x883ef 0x65c9d 0x5098b 0x5194b 0x62cb5 0x63beb 0x55698 0x1700df9 0x1700ad0 0x1d9cbf5 0x1d9c962 0x1dcdbb6 0x1dccf44 0x1dcce1b 0x5117a 0x52ffc 0x2a0d 0x2935) libc++abi.dylib: 终止调用抛出异常 (lldb)

我知道这与Storyboard中的子视图有关,但我不知道如何纠正此错误。我对iOS还很陌生,并且正在尝试自己学习,所以非常感谢任何帮助。

1个回答

88

添加:

[self.view layoutIfNeeded];

到此方法的结束

- (void)viewDidLayoutSubviews

在您的BannerViewController内部


15
考虑使用[self.view layoutIfNeeded]代替layoutSubviews(根据文档,不应直接调用它)。这仍然可以解决需要重新布局的问题。 - orip
3
需要在必要时调用布局(layout)的原因是什么?是因为子视图直到调用viewDidLayoutSubviews才被设置好吗? - coolio
4
只有在使用Xcode 6为iOS 8和7设计应用程序并覆盖viewDidLayoutSubviews时,我才会遇到这个问题。我知道在iOS 8上视图生命周期的顺序发生了一些变化,但只有在使用iOS 8 SDK或iOS 7应用程序时才会发生这种情况... iOS 7无法在第一次“viewDidLayoutSubviews”调用结束时正确地布局视图,因此您必须在修改覆盖方法中的内容后重新布局它们。 - dulgan
我想知道将调用 [super viewDidLayoutSubviews] 的语句放在方法末尾是否也能起到同样的效果。 - dulgan
1
这会导致iOS 9.2无限递归。 - iamandrewluca

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