2017-01-30 104 views
5

我在我的UIViewController中有一個正常的UITableView,約束爲全屏。這個tableView有一個自定義的互動tableHeaderView。 tableHeaderView的大小是動態的,並且可以自行擴展。 headerView有一個textField,並且會根據textField是否有焦點來改變它自己的大小。單元在UITableView動畫中消失

問題是,在更改tableHeaderView的大小時,屏幕底部的單元格並不總是正確動畫。 我在我的animation-block中調用layoutIfNeeded()之後的tableView.beginUpdates()tableView.endUpdates()。這必須完成,否則單元格根本不會遵循動態大小。

我製作了這個gif。在動畫過程中特別注意底部的單元格。我大大減慢了動畫速度,所以很容易看出問題所在。

gif of problem

猜測:在我看來,像的tableView爲cellForRow:indexPath:儘快調用的動畫開始,並以某種方式找出什麼狀態動畫之後,整個的tableView將是,在去除不需要的細胞,即使動畫還沒有完成。 同樣,摺疊標題時:最底層的單元格不像已加載單元格一樣動畫。他們用不同的動畫動畫..

這是爲什麼發生?這是可以預防的嗎?

編輯:動畫代碼

self.navigationController?.setNavigationBarHidden(isEditing, animated: true) 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 

    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.setContentOffset(point, animated: false) 
    }  

    tableHeaderView.frame = frame 
    tableHeaderView.layoutIfNeeded() 
    self.view.layoutIfNeeded() 
    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+2

你能顯示代碼嗎? – jalone

+0

在故事板中 - 選擇場景 - >顯示屬性檢查器 - >在頂部條之下,使頂部欄中的頂出。 – Pavankumar

+0

@Sti:使用應該共享一些代碼。 – Poles

回答

0

好吧,我會盡量提出我的版本,雖然我不能檢查它,因爲我沒有看到你的項目。我沒有嘗試編譯它,所以它可能會有錯誤。

var navFrame = self.navigationController?.navigationBar.frame 
navFrame.origin.y = isEditing ? -navFrame.size.height : 0 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 
    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.contentOffset = point 
    } 

    self.navigationController?.navigationBar.frame = navFrame 

    tableHeaderView.frame = frame 

    self.view.layoutIfNeeded() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+0

謝謝,我會嘗試這個,當我有時間去嘗試。但有一個問題,爲什麼像我已經擁有的那樣,手動隱藏navigationBar而不是使用'self.navigationController?.setNavigationBarHidden(isEditing,animated:true)?你認爲這可能與問題有關? – Sti

+0

@Sti是的,可能動畫衝突。 – jesse

0

我剛纔聽到從蘋果開發者技術支持團隊回來就這個問題,這裏是他們的反應逐字(重點煤礦)

您好尼古拉,

謝謝你聯繫Apple開發者技術支持(DTS)。

您所描述的行爲和結果限制是通過設計。

如果您認爲另一種方法應該由蘋果, 考慮,我們鼓勵您在 文件,信息的增強請求如何設計決策影響你,你想看到什麼做 不同。

雖然沒有承諾會改變行爲,但是 是確保您對此事的看法的最佳方式是由負責決定的團隊看到的 。

最好的問候,

蘋果開發者技術支持

看來,我們只是堅持必須使用一個簡單的調用要麼tableView.setContentOffset(_:animated:)tableView.scrollToRow(at:at:animated:)

+0

setContentOffset或scrollToRow會如何解決這個問題? – Sti

+0

它並沒有 - 我們只是堅持使用這些標準的方法調用,而無法將它與自定義動畫同步 - 這就是爲什麼團隊建議我們爲它提交增強請求的原因。換句話說,你可以通過將你的調用移動到動畫塊之外的任何一種方法來「修復」它。 – gomollon