セルを展開/縮小するテーブルビューがあります。
IOS 11の時点で、tableViewは行の挿入と削除で奇妙な動作を開始します。 contentSizeは、アニメーションブロックが発生する前に変更されているため、ビデオでは、折りたたみセルでバグが発生するスクロールバックが発生していることがわかります。アニメーションが間違っているように見えます。
このコードはiOS 10で完全に機能しました。Apple側で何が変わったのか誰にもわかりませんか?これは既知の問題ですか?
public func insertingRowsForAccordion(_ indexArray: [IndexPath], selectedRowIndex: Int) {
beginUpdates()
insertRows(at: indexArray, with: UITableViewRowAnimation.fade)
endUpdates()
// Scroll to selection after expanding children
scrollToRow(at: IndexPath(row: selectedRowIndex, section: 0), at: UITableViewScrollPosition.top, animated: true)
}
public func removeRowsForAccordion(_ indexArray: [IndexPath]) {
beginUpdates()
deleteRows(at: indexArray, with: UITableViewRowAnimation.fade)
endUpdates()
}
IOS 11 UITableView
で数え切れないほどの問題がありました。アプリ全体のすべてのUITableView
にアクセスし、次の操作を行うとすべての問題が修正されました。
estimatedRowHeight
、estimatedSectionHeaderHeight
、およびestimatedSectionFooterHeight
を0に設定します。
IOS 11でテーブル行を削除するアニメーションで同様の問題が発生し、テーブルセルが奇妙にスクロールすることがありました(iOS 10は正常に機能しました)。行の高さを返すこのデリゲートメソッドの実装が役立ちました。
- (CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
その後、iOS 10と11の両方が問題なく動作します。
IOS 11.2では、標準の行アクションを使用して行を削除すると、アニメーションが悪くなりました。 CATransactionで行の削除と行のアクションの破棄をラップすることで、状況を改善することができました。
最初に行アクションを閉じ、そのアニメーションが完了するのを待ってから、テーブルビューから行を削除します。
少なくとも、テーブルビューのコンテンツオフセットを回避することはできませんが、長い2ステップのアニメーションです。私はまだより良い解決策を探しています。
CATransaction.begin()
CATransaction.setCompletionBlock({
self.tableView.beginUpdates()
self.myViewModel?.items?.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.top)
self.tableView.endUpdates()
})
self.tableView.setEditing(false, animated: true)
CATransaction.commit()
このコードを使用して修正しました。
self.tableView.beginUpdates()
// ...
self.tableView.endUpdates()
self.tableView.layer.removeAllAnimations()