2017-03-23 31 views
0

更新:看起來tableView.estimatedRowHeight設置與問題有某種關係,因爲問題的變化隨着數字更改而變化,並將其設置爲9999使得它「消失」,但似乎超級哈克。 9999也打破了我想要在展示/隱藏中做的動畫。 9999還打破了滾動條的功能。有關其他詳細信息和完整上下文,請參閱下面的討論線iOS UITableViewController單元格在第一次更改後調整單元格高度後跳出位置

我有一個視圖控制器,它包含兩個Container Views。每個容器視圖都包含一個UITableView控制器。它們垂直取向,每個佔據整個高度。

右側的容器的寬度爲100,並在拖尾約束設置爲-100時啓動屏幕,允許其他容器在初始時填充整個屏幕。

左邊的表格使用UITableViewAutomaticDimension自動調整單元高度,因爲當顯示隱藏視圖時,兩行上的某些文本可能需要換行到下一行。

當我將約束更改爲0並顯示視圖時,如果我不在列表的頂部,而不是展開屏幕上顯示的內容,它似乎會擴展所有內容,從而推動所發生的事情屏幕下降,進一步比它應該去。

雖然有些奇怪,但隨後的展開/摺疊如預期的那樣工作,只調整可見的內容。

我附上了一個視頻,顯示了這個問題,我只是試圖連接東西並獲得尺寸,現在正確的視圖內容將有所不同。

以下是發生了什麼事在視頻

  1. 我從列表的頂部展開/摺疊和它的作品如預期
  2. 我滾動到列表中,並擴大規模,我的內容變推進比應該進一步。
  3. 然後我摺疊並再次展開它,這次它保持原位,因爲在可見屏幕上沒有大小改變。

不管我走多遠,同樣的行爲發生,隨着我進一步下去,情況會變得更糟。

enter image description here

我調整上的按鈕按這樣的約束了。

if self.timeContainerConstraint.constant == 0 { 
     self.timeContainerConstraint.constant = -90.0 
    } else { 
     self.timeContainerConstraint.constant = 0.0 
    } 

有誰知道爲什麼,當我向下滾動列表並展開第一次的內容是跳躍,但不能過早隨後嘗試?

+0

你有沒有實施'estimatedHeightForRowAt:'? – Paulw11

+0

不,但我已經設置了估計值RowHeight tableView.estimatedRowHeight = 140 – Ben987654

+0

您是否在更改約束後在容器上調用'layoutIfNeeded'? – Paulw11

回答

3

由於您的單元格高度可變,因此tableview無法正確計算其框架更改時的滾動偏移量。它必須依賴估計的行高,但是因爲您有一個固定值,所以當前滾動位置上方的單元格越多,估計值和實際值之間的誤差就越大。

我能夠爲了緩存單元格的高度來解決這個返回使用estimatedHeightForRowAt:

var cellHeights = [IndexPath:CGFloat]() 

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    let frame = tableView.rectForRow(at: indexPath) 

    self.cellHeights[indexPath] = frame.size.height 

} 

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return self.cellHeights[indexPath] ?? 140.0 
} 

使用這種方法,膨脹和收縮邊欄並沒有影響到更準確的估計高度桌子的位置。我能夠對約束條件變化進行動畫處理,以獲得良好的流暢顯示,即使表格在側欄打開時滾動,表格也不會「跳躍」。

我的樣本項目是here

+0

哇,我認爲這是完美的工作,甚至解決了我還沒有考慮過的其他動畫片斷。我必須跑去上班,但當我回家時,我會給它一個更好的看看,並且在經過多一點測試之後,如果事情仍然很好,請將其標記出來。 – Ben987654

+0

它工作得很漂亮。非常感謝你對這個問題的所有幫助! – Ben987654

相關問題