簡體   English   中英

iOS8使用Interface Builder自行調整靜態TableView單元格

[英]iOS8 self-sizing static TableView cells with Interface Builder

我很高興能夠在Xcode中構建我的靜態TableView,使用自動布局來支持動態類型,如WWDC2014中提到的表和集合視圖中的新功能

我更喜歡嚴格使用Xcode / Interface Builder和故事板來處理自動布局。 當我這樣做時,不知何故TableView單元格沒有調整大小,我確信我錯過了一些簡單的東西。

為了重現這一點,使用Xcode 7 beta 5,我:

  • 創建了一個新的單一視圖項目。
  • 將Storyboard入口點設置為新的UITableViewController。
  • 使其成為具有分組樣式的靜態表視圖。
  • 在第一行添加了一個標簽。 為頂部,底部,左側和右側添加了約束。
  • 將標簽字體設置為“正文”。
  • 添加到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中的相同步驟確認了這一點。

  1. 創建新的單一視圖應用程序
  2. 新文件。 Cocoa類“MyStaticTableViewController”,UITableViewController的子類。
  3. 在Storyboard中,拖動新的表視圖控制器。
  4. 將Class更改為MyStaticTableViewController。
  5. 將故事板入口點拖動到新VC。
  6. 刪除原始VC。
  7. 將類更改為MyStaticTableViewController以獲取新VC。
  8. 選擇表視圖。 將內容更改為靜態單元格並將樣式更改為分組。
  9. 將新標簽拖到第一個表視圖單元格。 將字體更改為正文。 將頂部,底部,左側,右側約束設置為0並更新幀。
  10. 在MyStaticTableViewController.m中,添加:
  - (void)viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0; } 
  1. 使用動態類型驗證增加大小會導致表格行也展開。

由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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM