[英]iOS8 self-sizing static TableView cells with Interface Builder
我很高興能夠在Xcode中構建我的靜態TableView,使用自動布局來支持動態類型,如WWDC2014中提到的表和集合視圖中的新功能 。
我更喜歡嚴格使用Xcode / Interface Builder和故事板來處理自動布局。 當我這樣做時,不知何故TableView單元格沒有調整大小,我確信我錯過了一些簡單的東西。
為了重現這一點,使用Xcode 7 beta 5,我:
添加到ViewDidLoad:
self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0;
在設置中調整並調整動態類型。 字體更改時,TableView高度仍然停留在明顯的默認值44並截斷標簽。
這是一個GitHub存儲庫 ,它是上面的結果。
為什么Auto Layout不會導致TableView擴展以填充必要的空間以適應新的更大標簽文本?
我已經找到了關於這個主題的好帖子,如下所示,並且在這里一直在使用代碼來設置約束。
我沒有找到任何在純Interface Builder中執行此操作的示例。 當然這很有可能嗎?
更新
我已經更新了GitHub源代碼,以包含一個帶有ImageView而不是UILabel的第二個表行; 它顯示了同樣的問題:
此外,當我在標簽或圖像視圖上設置顯式高度約束時,我生成以下內容。 問題似乎是我沒有設置的“UIView-Encapsulated-Layout-Height”約束。 我猜它是生成的,因為在我的IB靜態表視圖中,行高被設置為(默認)為44。
Unable to simultaneously satisfy constraints.
...
"<NSLayoutConstraint:0x7fa371f39e30 V:[UILabel:0x7fa371f38d30'Label'(20)]>",
"<NSLayoutConstraint:0x7fa371c39160 UILabel:0x7fa371f38d30'Label'.top == UITableViewCellContentView:0x7fa371e17dc0.topMargin>",
"<NSLayoutConstraint:0x7fa371c393c0 UITableViewCellContentView:0x7fa371e17dc0.bottomMargin == UILabel:0x7fa371f38d30'Label'.bottom>",
"<NSLayoutConstraint:0x7fa371f41a40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fa371e17dc0(43.5)]>"
但是ViewDidLoad中的這個不應該超越這個嗎?
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
自行調整表格視圖單元格是否不適用於靜態表格視圖?
更新2
我使用動態原型而不是靜態表視圖構建了相同的東西,並且一切正常:
它確實似乎是靜態的與動態原型表。 靜態表視圖單元格未正確展開。
我在WWDC視頻中沒有看到動態與靜態的關系,所以在這一點上我將這個問題搞砸了。 如果我學到新東西,我會更新。
我已經更新了上面的GitHub存儲庫,以顯示靜態(損壞)和動態(工作)表視圖的示例。
回答:
這是Xcode7b5中的一個錯誤。 我剛剛通過遵循Xcode 6.4和Xcode 7b5中的相同步驟確認了這一點。
- (void)viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0; }
由Xcode 6.4創建的項目按預期工作 - 表格視圖單元格擴展以適合標簽。
由Xcode 7b5創建的項目失敗,如原始問題中所述。
有趣的是,如果使用Xcode7打開Xcode6項目,它也可以正常工作。 這與Xcode7如何創建項目或故事板有關。
更新
我將.storyboard文件相互比較,並在tableView條目下的破碎的Xcode7b5中,定義了一個rect:
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
我刪除了這一行,似乎表視圖單元格現在正確地自我調整大小!
更新2
關鍵問題似乎是XML文件中每個“tableViewCell”條目下面的“rect”條目。 重擊那些是解決這個問題的方法。
更新3
提起雷達:
“Engineering已確定您的錯誤報告(22311571)與另一個問題(17995201)重復,並將被關閉。”
我沒有時間查看代碼,但我幾乎可以肯定問題是標簽。 字體大小會更改,但標簽的大小不會更改。 我懷疑是因為文本在占據整行之后沒有被截斷,所以它留下了一小部分。
快速測試:在文本標簽上添加彩色背景。 我敢打賭,你會注意到它沒有增長。 如果沒有,請看一下: 根據文字調整UILabel高度
對於靜態表視圖單元格,您不能在ViewDidLoad中使用UITableViewAutomaticDimension。 相反,使用override func heightForRowAt。 我的viewDidLoad中沒有任何內容。 我在ViewDidLoad上面添加了這兩個覆蓋函數。
//第一個覆蓋每行的高度,以便自動調整大小。
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
//這會在調整大小之前估計行的高度
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
只要您有頂部,底部,左側和右側布局約束,一切都應該調整大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.