1. 程式人生 > >swift4.0 模擬微博cell, AutoLayout自動計算rowHeight, 約束衝突問題解決!

swift4.0 模擬微博cell, AutoLayout自動計算rowHeight, 約束衝突問題解決!

背景介紹:

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, 果然問題解決. 但是最好還是註釋掉!交由子類自己實現!
這樣,在子類中自動計算行高的時候, 就不會由於基類的行高影響子類.

這裡寫圖片描述