2016年4月12日 星期二

[IOS] 動態行高 (自動計算行高) With UILabel


現在 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 裡設定或在程式碼裡設定都可以

如果在程式碼裡設定就必須在計算行高前就先呼叫才可以



再來就要進入程式碼的部分啦

我自己會這在這些地方加上程式碼




  1. - (void)viewDidLoad {
  2.     [super viewDidLoad];
  3.     
  4.     [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"CustomCell"];
  5.     
  6. }


然後關鍵就在下個函示了

labelContent 是我中間內容 Label 的變數名稱


  1. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  2.     

  3.     CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
  4.     
  5.    cell.labelContent.text = @"字串內容"; 
  6.    
  7.     cell.labelContent.preferredMaxLayoutWidth = CGRectGetWidth(cell.labelContent.frame);
  8.     
  9.     //一定要在下面這兩行前給字串內容跟設定“preferredMaxLayoutWidth”

  10.     [cell setNeedsUpdateConstraints];
  11.     [cell updateConstraintsIfNeeded];
  12.     
  13.     
  14.     CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
  15.     
  16.     NSLog(@"height = %f",height);
  17.     
  18.     return height + 10;
  19.     
  20. }

 height + 10 是我自己加上去的,我不想讓整個空間太過壅擠

網路上很多人都說至少要+1才會是正確的

所以要加多少自己決定囉



另外如果你在找網路上時可能也會看到這種方式

  1. tableView.estimatedRowHeight = 44.0
  2. tableView.rowHeight = UITableViewAutomaticDimension

這種方式詳細內容可以再去網路上查,不過這方式只支援 IOS8 以上
而我自己仍然需要支援 IOS7 所以就沒使用這種方式

題外話小知識


Leading , Trailing 起出在學AutoLayout 時覺得為什麼不用左右就好

Left 跟 Right 多好區分啊!!!  (還不是你英文太爛!)

那為什麼不這樣用呢?

最主要是因為閱讀方式的關係

以台灣閱讀方式 由左至右

但在阿拉伯或某些國家,則是由右至左的閱讀習慣

所以無聊的話可以把語系去設成阿拉伯語系看看

會發現左右相反喔!!



沒有留言:

張貼留言