一、出现崩溃情景:
给tableView创建一个头视图,也即tableHeaderView,然后使用Masonry并切换到iOS7/7.1系统给tableHeaderView中的所有子视图添加约束,此时出现崩溃。
二、崩溃日志:
Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘Auto Layout still required after executing -layoutSubviews. UITableView‘s implementation of -layoutSubviews needs to call super.
三、崩溃原因:
据说AutoLayout是iOS6的一个bug,在iOS7上已经解决了,但实际使用还是遇到了这个问题,有可能还是没修复。
四、解决办法:
(1)采用setFrame方法,在layoutSubViews中给子视图计算相对位置。
(2)采用Masonry框架,不在layoutSubViews中进行,而是自定义一个方法,例如-(void)setupConstraint,然后在该方法中进行autolayout约束,在init或者initFrame中添加子视图后,调用该方法即可,也即[self setupConstraint]。
(3)采用Masonry框架,在layoutSubViews中进行,在该方法中进行autolayout约束,但是必须放在[super layoutSubViews]方法之前进行
(4)Swizzling。网上比较多的说法是说给UITableView添加一个分类,在分类中覆盖+load方法,然后再load方法中使用swizzling来调整函数的执行顺序,保证执行完Autolayout后调用super -layoutSubviews。这是一个此方法的链接:关于swizzling。
五、额外补充:
在ios7上,使用Autolayout添加子视图到UIScrollView上是没问题的。