2014-12-05 59 views
7

當使用moveRowAtIndexPath:toIndexPath:到移動UITableViewCell,我使用estimatedRowHeightUITableViewAutomaticDimension時,當電池從可見狀態看動畫的動畫毛刺到不可見狀態。的UITableViewCell動畫的bug`moveRowAtIndexPath:toIndexPath:`,而使用`estimatedRowHeight`和`UITableViewAutomaticDimension`

如果我通過實施tableView:heightForRowAtIndexPath:明確設置單元格的高度,問題就會消失。該問題僅在源和目標索引路徑分別可見和不可見時纔會顯示。當單元格移動到另一個可見的索引路徑時,動畫將按預期行爲。

我創建了一個樣本項目來說明效果:https://github.com/timarnold/Table-Cell-Sizing-Bug

http://www.openradar.me/19156703

編輯

@rdelmar指出我的問題實際上並沒有提出一個問題。

有誰知道解決此錯誤的方法並解決此問題?或者我做錯了什麼?

編輯2014年12月8日

我用我的蘋果開發者提供的支持票一個詢問有關此問題與蘋果。他們確認這是一個錯誤(訪問http://www.openradar.me/19156703來欺騙),但沒有提供任何解決方法。

+0

你知道如何解決這個問題,那麼你的問題是什麼?我認爲這是一個「你得到你付出的代價」的例子(付出是時間和代碼的複雜性)。這和滾動到特定索引路徑的問題是估計高度被使用的方式的結果,所以我認爲你不能修復它(看看蘋果是否可以修復它,而不犧牲速度優勢使用估計的高度)。您可以通過提供更準確的高度估計值來最大限度地降低影響(儘管如果您的高度變化很大,那麼這將不會有多大幫助)。 – rdelmar 2014-12-05 16:59:59

+0

好吧,這不是一個問題,因爲它是一個問題的文檔和對潛在解決方法的請求(我想我的請求應該更明確;將編輯問題)。我認爲把這種行爲歸類爲錯誤是公平的,但是,因爲重現項目相當簡單並且使用了所有庫存組件和功能。 – 2014-12-05 17:03:59

+0

我不知道我是否會把它稱爲一個錯誤,或者只是蘋果公司在速度和正確性之間權衡的結果。這是一種適用於某些情況的技術,但不是全部。我認爲唯一的解決辦法是計算高度「老式」的方式 - 我希望我錯了,因爲當他們工作時,新的自動調整細胞非常棒。 – rdelmar 2014-12-05 17:12:02

回答

-2

Tim,

這不是一個確定的答案,而是一些有趣的發現。我相信您所遇到的行爲與iOS在設備屏幕上繪製單元格的方式有關,而不是錯誤。更具體地說,對於屏幕外的細胞。因爲數據源不受單元格重新排序影響單元格位置的影響。

爲了讓我更清楚一點我已經做了以下修改TableViewController.m

didSelectRowAtIndexPath

[tableView moveRowAtIndexPath:indexPath 
          toIndexPath:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:indexPath.section]]; 

cellForRowAtIndexPath

cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row + 1]; 


你會看到,僅有細胞胡作非爲當移動到屏幕視圖之外的位置時。此外,每次移動屏幕時都會重繪單元格。

+1

「錯誤」和「您遇到的行爲」之間的差異與文檔所述的預期行爲不匹配會發生什麼? – 2015-02-02 17:08:10

+0

@AnthonyMattox你的問題不清楚。我從來沒有提到過一個文檔。我正在測試代碼。 – carlodurso 2015-02-02 17:15:02

0

試着緩存細胞高度。

private var cellHeights = [NSIndexPath: CGFloat]() 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if let cachedHeight = cellHeights[indexPath] { 
     return cachedHeight 
    } else { 
     return 60 
    } 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    cellHeights[indexPath] = cell.frame.height 
}