web-dev-qa-db-ja.com

iOS 11 UITableViewの行アニメーションの削除バグ

tableviewアニメーションバグのビデオ

セルを展開/縮小するテーブルビューがあります。

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()
}
21
l.vasilev

IOS 11 UITableViewで数え切れないほどの問題がありました。アプリ全体のすべてのUITableViewにアクセスし、次の操作を行うとすべての問題が修正されました。

estimatedRowHeightestimatedSectionHeaderHeight、およびestimatedSectionFooterHeightを0に設定します。

ソース: iOS 11フローティングTableViewヘッダー

31
jvdev7

IOS 11でテーブル行を削除するアニメーションで同様の問題が発生し、テーブルセルが奇妙にスクロールすることがありました(iOS 10は正常に機能しました)。行の高さを返すこのデリゲートメソッドの実装が役立ちました。

- (CGFloat) tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

その後、iOS 10と11の両方が問題なく動作します。

6
Chuck Boris

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()
5
Edward Hellyer

このコードを使用して修正しました。

self.tableView.beginUpdates()
// ...
self.tableView.endUpdates()
self.tableView.layer.removeAllAnimations()
3
Piotr Merski