以往我們做cell的自適應的時候都是要寫許多的代碼進行計算高度,而且在適配的時候容易出現問題,費時耗工.那么下面我們就共同探討一種基於xib的自動計算高度的方法
1.我們先創建tableView,tableView的創建可以使用可視化編程,也可以手寫代碼
2,自定義cell,要求必須使用xib
在cell上添加控件的時候,我們必須確定這個控件的哪個方向上的量是確定的,哪個方向上的量是不確定的
首先我們現在cell的左上角拖一個imageView
我們可以確定imageView只需要通過 它距左 上的距離以及它自身的寬高 這些數值我們可以根據需求直接寫定
接下來就是imageView右側的Label,我們根據上圖可以看出,這個Label的寬度是會發生變化的,那么我們先將不需要變化的量給定,然后先給需要變化的寬一個預估計值
Label的左側是相對於imageView的距離
那么我們如何將Label的寬度設為自適應
點擊Label,然后點擊xcode右側,選擇調整尺度的選項,將需要改變的量前面的"="變為">="
然后就是下面的Label的自適應,究其原理基本上和上面的這個Label是一樣的
這個Label的上邊是基於imageView,左側右側可以自己根據需求給定數值,寬度是一定的,據下邊的距離是一定的,只有高度需要自適應,設置方法和上面一致,都是改為">=".由於這個Label顯示的內容可能會出現多行,所以我們需要在將他的行數設置為0,也就是無限行
2,設置完cell的控件,我們需要將自定義的cell加上標識符,當然,標識符的內容可以自行設置
3.然后我們將自定義的cell里面的控件與cell進行關聯
4,tableView里面的設置就是正常的程序,不過在這里我們需要用注冊的方式進行創建cell
其中紅色箭頭指向的字符串是我們剛才在自定義cell的時候寫的標識符
黃色箭頭指向的字符串是我們創建的自定義cell的類名,這里不要寫錯了,不然會出現nib找不到的錯誤提示
在其他的地方的創建就和我們通常寫的tableView的創建方法是一樣的
但是這樣寫是有問題的,因為如果我們轉動屏幕的時候,我們之前的布局就會全部變亂,那么我們應該怎么做呢
首先,我們先將我們需要自定義高度的Label抽離出來,再創建一個類,基於UILabel,在我們創建的UILabel類中,我們需要重寫一個方法
同時,我們在自定義cell里面需要自適應高度的Label創建時就應該使用我們定義的UILabel
下面我們要做的就是在tableView里邊返回行高,在返回行高的方法里面我們要根據Label里面的內容進行判斷cell的高度
首先我們現在tableView里面寫一個自定義cell的屬性
@interface TableViewController () @property (nonatomic, strong) MyCell *computCell; @end接下來我們需要注冊計算高度的cell,就是我們設置的這個屬性cell
//注冊計算高度的cell self.computCell = [self.tableView dequeueReusableCellWithIdentifier:@"MyCell"];
上面的代碼就是我們返回高度的計算方法,
* 紅色箭頭標注的是我們需要傳入自適應Label里面的內容,這樣我們就可以根據內容來計算cell的高度
* 接下來的坐標,寬度設置,我們使用的是tableView的寬度,因為我們不需要對其寬度進行自適應,但是后面的高度我們使用的就 是我們自定義的cell的寬度,因為我們要根據Label的高度來計算整個cell的高度
* 最后返回高度的時候我們使用的是contentView
這樣計算出的自適應高度,當我們旋轉屏幕的時候,我們的cell的整個布局也不會發生變化
當然,如果我們的cell上的內容要是比這個豐富的話,在我們往cell上拖空間的時候,會比較麻煩,我們只需要確定哪個量是會變化的,哪個量是不會變化的,這樣我們就可以完成自適應.這樣寫,比我們以前的方法要省時間,當然,現在剛開始可能會比較慢