自动布局和子视图

Posted

技术标签:

【中文标题】自动布局和子视图【英文标题】:Autolayout and subviews 【发布时间】:2013-08-25 13:56:40 【问题描述】:

根据此链接,我正在使用带有 Apple 故事板的 iAd 套件... Apple iAd Storyboard documentation

在我打开自动布局之前一切正常。它构建良好,但在运行时崩溃。我得到的输出是:

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)

我知道这与情节提要中的子视图有关,但我不知道如何纠正此错误。我对 ios 很陌生,并试图自学,所以任何帮助表示赞赏。非常感谢

【问题讨论】:

【参考方案1】:

添加:

[self.view layoutIfNeeded];

到此方法的结束

- (void)viewDidLayoutSubviews

在你的BannerViewController里面

【讨论】:

考虑使用[self.view layoutIfNeeded] 而不是layoutSubviews(根据文档,不应直接调用)。这样应该还是可以解决需要重新布局的问题。 如果需要,需要调用布局的原因是什么?是因为在调用 viewDidLayoutSubviews 之前没有设置子视图吗? 当我使用 Xcode 6 为 iOS 8 和 7 设计应用程序并覆盖 viewDidLayoutSubviews 时,只会在 iOS 7 上发生这种情况。我知道 iOS 8 上视图生命周期的顺序发生了一些变化,但这只是在使用 iOS 8 SDK 或 iOS 7 应用程序时发生在我身上...... iOS 7 无法在第一个结束时正确布局视图“ viewDidLayoutSubviews" 调用,您必须在重写方法中修改内容后重新布局它们 我想知道在方法结束时调用 [super viewDidLayoutSubviews] 是否也可以解决问题 这会导致iOS 9.2无限递归

以上是关于自动布局和子视图的主要内容,如果未能解决你的问题,请参考以下文章

内嵌视图的自动布局约束[重复]

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

空 UIView 上的自动布局约束无法按预期工作

Xcode 6 - 另一个自动布局视图中的自动布局视图

以编程方式将自动布局添加到肋骨中添加的现有自动布局视图