2016-02-04 66 views
0

我對Apple的動態調整大小的單元格有問題,例如我的單元格佈局的邏輯不像只有少數幾個疊加的UILabel那樣被切割和乾燥。iOS計算單元格的高度

因此,我無法真正使用它們提供的動態調整大小選項,因此我需要使用NSString boundingRect方法手動計算單元格的高度。

這很好 - 它的工作原理,但我最終需要存儲很多常量來跟蹤我的自動佈局約束。我覺得這是違反自動佈局應該爲我做的直覺,所以我不確定這是否是實現heightForRowAtIndexPath的正確方法。

我基本上必須將我的約束複製到一個常量中,然後在類方法中使用這些值來生成我的高度。 Apple對UITableViewAutomaticDimension的工作原理提供了很少的內部見解,但很明顯,在佈局之前,單元格的高度仍然是計算出來的。因此我不能真正添加​​任何複雜的邏輯,除非我知道之前調用的方法。

關於我應該做什麼或者我的方法是否正確的想法?

+1

「我的細胞佈局邏輯不像切割和乾燥」 - 邏輯是什麼? – kelin

+0

boundingRect不是計算標籤(或其他)大小的正確方法,-sizeToFit或-sizeThatFits:是正確的 – Andrea

+0

@kelin我有兩個標籤。如果左側標籤的寬度切入正確的標籤,請將右側標籤右側的標籤移動。如果左邊的標籤需要多行,也可以將右邊的標籤移動到左邊的標籤下面。 –

回答

0

我可以提供的通用解決方案是爲您的單元格添加高度約束,並根據需要更改約束,無論它們是什麼。 UITableViewAutomaticDimension會將單元格的大小自動調整爲您使用此約束指定的高度。

+0

是的,但我可以在哪裏修改高度限制? LayoutSubviews被調用得太晚 - 單元的高度由該點決定。如果在初始化後立即設置,所有子視圖的幀都是錯誤的。 –

0

如果你的表格單元格的自定義那麼它更容易,如果你使用像configureCell的方法和indexPath從cellForRowAtIndexPath傳遞給它,然後確定基於您已經和數據的佈局看到你想要的左邊和右邊的標籤將被置於。完成此操作後,將存儲模型中所需的高度,或者存儲與您的表具有相同行數的另一個陣列的高度,然後使用它返回heightForRowAtIndexPath

這樣更容易,而且不需要調整過多的表視圖委託方法就可以提供靈活性。在一個地方集中佈局邏輯。 另一種替代方法是覆蓋表視圖單元格的layoutSubviews並計算其高度並存儲它。

+0

謝謝,我看到原型單元格類型的方法比我所期望的更普遍。我喜歡你描述得更好的第二種方法,但這不起作用。 layoutSubviews是在計算高度後調用的,所以我不會在時間上有高度。 –

+0

如果你有一個自定義單元,那麼或許你最好的選擇是使用第一種方法。如果您想基於內容重新排列標籤,那麼我認爲您必須事先計算高度並將其返回,然後在layoutSubviews中,您可以根據文本大小將標籤移動到右側或下側。你是對的layoutSubviews不能用於計算高度。高度已經確定在那個點上。 –

0

如果您希望爲您的tableview單元格分配一個默認高度,則可以使用estimatedHeightForRowAtIndexPath:在UITableViewDelegate中可用。按照Apple指導原則:

//使用estimatedHeight方法快速計算猜測值,這將允許快速加載表格。 //如果實現了這些方法,則上述-tableView:heightForXXX調用將被延遲,直到可以顯示視圖爲止,因此可以在其中放置更昂貴的邏輯。