swift4.0 模擬微博cell, AutoLayout自動計算rowHeight, 約束衝突問題解決!
阿新 • • 發佈:2019-02-10
背景介紹:
1.我有一個baseViewController. 裡面內建一個父類級別的tableView. 並且實現好了代理方法,以供子類重寫實現自己的功能
// MARK: - 基類tableView代理方法
extension LFBaseViewController: UITableViewDataSource,UITableViewDelegate {
//基類只是負責方法的提供 - 具體實現交由子類處理
func numberOfSections(in tableView: UITableView) -> Int {
//返回值不做要求 - 只是為了語法不出錯誤
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//返回值不做要求 - 只是為了語法不出錯誤
return 0
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
//返回值不做要求 - 只是為了語法不出錯誤
return 44
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//返回值不做要求 - 只是為了語法不出錯誤
return UITableViewCell()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
}
2. 我又有一個HomeViewController的子類
這裡負責具體實現 微博資料cell的載入!
我們知道, 在iOS8以後, 可以使用AutoLayout的xib約束配合這兩個屬性,讓cell的行高自動計算
// 設定行高
tableView?.rowHeight = UITableViewAutomaticDimension
// 設定預估的行高
tableView?.estimatedRowHeight = 60
當我完成了xib的約束設定
一開始,我一直以為的xib設定有問題,以至於出現錯誤後,一直報約束衝突. 其實xib部分的約束新增是ok的.
出現問題
如圖
再看約束情況
約束衝突日誌
一開始方向錯誤,一直在排查xib部分約束是否設定有誤,直到使用一個非常簡單的xib佈局一個Label,問題依舊.才把目光放在報錯日誌上
仔細閱讀衝突日誌以及xib的對應約束, 發現 NSLayoutConstraint:0x60000029fdb0 UITableViewCellContentView:0x7fbe86559240.height == 44, 這個內容在我的xib中, 壓根不存在, 再一看, 44不是我們常見的好夥伴麼
這個44我好想在哪裡寫過. 同時,也在懷疑,是否由於cell的行高過小以及被寫死,導致了約束的衝突, 看圖明顯覺得,頭像icon的圖片被嚴重壓縮.
=====
問(zui)題(kui)解(huo)決(shou)
還記得最開始, 我的BaseViewController嗎, 那裡面就寫死了返回行高44! 嘗試著改為100, 果然問題解決. 但是最好還是註釋掉!交由子類自己實現!
這樣,在子類中自動計算行高的時候, 就不會由於基類的行高影響子類.