1. 程式人生 > >iOS8下動態改變Cell高度以及iOS8的動態型別理解

iOS8下動態改變Cell高度以及iOS8的動態型別理解

在iOS8中,蘋果給出了一個激動人心的特性,UITableView 的 Self Sizing Cells。對於開發者來說,這是一個很值得一試的特性,在iOS8以前,如果需要在UITableViewCell中展示動態的內容,必須每次計算內容所佔高度,然後賦值給UITableView的height。 

iOS8中如何使用此特性呢?基本有三步: 

  • 針對自定義Cell進行Layout Constraints設定 
  • 設定estimatedRowHeight 
  • 這是UITableView的RowHeight為UITableViewAutomaticDimension 

後兩部的程式碼類似這樣: 

tableView

.estimatedRowHeight = 68.0 

tableView.rowHeight = UITableViewAutomaticDimension


只有兩行程式碼,你的UITableView就會根據內容動態展示了。這種自我調整單元的特徵應為您節省程式碼和時間。你會愛上它。

self-sizing-cell-featured

Building a Simple Demo Using Self Sizing Cell 

沒有比使用一個特性更好的學習它的方法了。這裡將會使用一個專案模板來學習self sizing cell。自定義cell上有兩個label,分別用來展示名稱和地址。你可以下載模板應用模板,來進行後面的學習,在模板中沒有做任何的Constraints設定等。執行專案後如下所示: 

table-view-truncated-text

可以看到,這個UITableViewCell 並沒有更具內容動態改變高度,我們希望達到的目標就是名稱和地址都可以完全的顯示,Cell可以根據內容動態的改變。 

Adding Auto Layout Constraints 

在iOS8以前,如果要動態改變高度,需要考慮字型,行數等等一些因素,而且還不一定準確,但是在iOS8中,這些因素都可以不用考慮,動態特性會幫你做很多事情。 

開啟專案工程後,在IB中可以看到有一個UITableViewController,選擇UITableVIew中的Name Label。設定其Constraints屬性: 

self-sizing-cell-auto-layout-1

再次選擇Address Label 設定: 

self-sizing-cell-auto-layout-2

完成後,如果無誤,檢視IB中控制元件:
self-sizing-cell-constraint-1
self-sizing-cell-constraint-2

Setting Estimated Row Height 

針對AutoLayout的設定,需要在ViewDidLoad方法中,設定UITableView屬性: 

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

如果此時執行,會發現Name Label 和 Address Label還是沒自適應。原因是兩個Label的Lines還是預設的1導致的,回到IB中,分別設定Name Label 和Address Label 的line屬性為0: 

self-sizing-numofline

再次執行,cell的高度已經可以根據內容來動態改變高度了。
self-sizing-cell-demo.

A Bug?! 

不知道是不是Bug,在應用第一次執行的時候,有些Cell並沒有自動適應其內容,解決的辦法就是重新整理tableView: 

1 2 3 4 5
 override func viewDidAppear(animated: Bool) {  tableView.reloadData()  } 

Dynamic Type 

接著驗證一下Self Sizing 特性,到系統設定中改變文字字型大小,然後回到應用中檢視: 

如果正常,你會發現UITableView的內容也跟著有變化,並且cell的高度也會隨著內容變化的: 

Summary 

iOS8中還有很多待使用的特性,這些特性的目的就是讓開發應用更加的方便快捷。往往僅需要幾行程式碼就能實現一些iOS8以前需要大量程式碼的效果等。這對此介紹,完整的Demo可以點選下載:Demo下載