現在 AutoLayout 已經發展好一陣子了,前陣子我才正式栽進去使用
接著面臨到要使用 AutoLayout 去判斷 TableView 行高的難題
雖然之前已經接受過考驗,但十分的不熟悉,倒置在今天我又再次遇到了這個問題
所以決定把 <動態行高> 的學習紀錄寫下
首先得先將 UITableViewCell 給拉好你想要的畫面,使用 AutoLayout 的方式
我給我自己新創建的 UITableViewCell 取名為 CustomCell
所以以下看到 CustomCell 可以替換為你自己所創建的名字
這是我所建立的CustomCell
分別有標題,內容和more的按鈕三個物件
只有中間的內容會變動高度,所以整個 Cell 的高度會取決於內容
我的標題下了 Leading , Top , Width , Height 4個條件
內容下了 Leading , Top , Bottom , Trailing 4個條件
按鈕下了 Bottom , Trailing , Width , Height 4個條件
中間內容的 Label 要在設定這些
numberOfLines = 0
lineBreakMode 要設定成 NSLineBreakByWordWrapping 或 NSLineBreakByCharWrapping
和要在 Xib 裡設定或在程式碼裡設定都可以
如果在程式碼裡設定就必須在計算行高前就先呼叫才可以
再來就要進入程式碼的部分啦
我自己會這在這些地方加上程式碼
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"CustomCell"];
- }
然後關鍵就在下個函示了
labelContent 是我中間內容 Label 的變數名稱
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
- CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
- cell.labelContent.text = @"字串內容";
- cell.labelContent.preferredMaxLayoutWidth = CGRectGetWidth(cell.labelContent.frame);
- //一定要在下面這兩行前給字串內容跟設定“preferredMaxLayoutWidth”
- [cell setNeedsUpdateConstraints];
- [cell updateConstraintsIfNeeded];
- CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
- NSLog(@"height = %f",height);
- return height + 10;
- }
height + 10 是我自己加上去的,我不想讓整個空間太過壅擠
網路上很多人都說至少要+1才會是正確的
所以要加多少自己決定囉
另外如果你在找網路上時可能也會看到這種方式
- tableView.estimatedRowHeight = 44.0
- tableView.rowHeight = UITableViewAutomaticDimension
這種方式詳細內容可以再去網路上查,不過這方式只支援 IOS8 以上
而我自己仍然需要支援 IOS7 所以就沒使用這種方式
題外話小知識
Leading , Trailing 起出在學AutoLayout 時覺得為什麼不用左右就好
Left 跟 Right 多好區分啊!!! (還不是你英文太爛!)
那為什麼不這樣用呢?
最主要是因為閱讀方式的關係
以台灣閱讀方式 由左至右
但在阿拉伯或某些國家,則是由右至左的閱讀習慣
所以無聊的話可以把語系去設成阿拉伯語系看看
會發現左右相反喔!!
沒有留言:
張貼留言