iOS:在tableView中經過Masonry使用autolayout在iOS7系統出現約束崩潰

1、出現崩潰情景:ios

給tableView建立一個頭視圖,也即tableHeaderView,而後使用Masonry並切換到iOS7/7.1系統給tableHeaderView中的全部子視圖添加約束,此時出現崩潰。git

 

2、崩潰日誌:github

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.app

 

3、崩潰緣由:框架

聽說AutoLayout是iOS6的一個bug,在iOS7上已經解決了,但實際使用仍是遇到了這個問題,有可能仍是沒修復。函數

 

4、解決辦法:ui

(1)採用setFrame方法,在layoutSubViews中給子視圖計算相對位置。spa

(2)採用Masonry框架,不在layoutSubViews中進行,而是自定義一個方法,例如-(void)setupConstraint,而後在該方法中進行autolayout約束,在init或者initFrame中添加子視圖後,調用該方法便可,也即[self setupConstraint]。日誌

(3)採用Masonry框架,在layoutSubViews中進行,在該方法中進行autolayout約束,可是必須放在[super layoutSubViews]方法以前進行blog

(4)Swizzling網上比較多的說法是說給UITableView添加一個分類,在分類中覆蓋+load方法,而後再load方法中使用swizzling來調整函數的執行順序,保證執行完Autolayout後調用super -layoutSubviews。這是一個此方法的連接:關於swizzling

 

5、額外補充:

在ios7上,使用Autolayout添加子視圖到UIScrollView上是沒問題的。

相關文章
相關標籤/搜索