web-dev-qa-db-fra.com

iOS 11 UITableView bug d'animation de suppression de lignes

vidéo du bug d'animation de tableview

J'ai une vue de table qui développe/réduit ses cellules.

À partir d'iOS 11, la tableView commence à se comporter étrangement lors de l'insertion et de la suppression de lignes. Le contentSize a changé avant que le bloc d'animation ne se produise et, par conséquent, dans la vidéo, vous pouvez voir un défilement de buggy se produire sur les cellules qui s'effondrent. L'animation semble juste fausse.

Ce code fonctionnait parfaitement sur iOS 10. Est-ce que quelqu'un sait ce qui a changé du côté d'Apple? est-ce un problème connu?

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

J'ai eu d'innombrables problèmes avec iOS 11 UITableView. Aller à chaque UITableView dans toute mon application et faire ce qui suit a résolu tous mes problèmes.

Définissez estimatedRowHeight, estimatedSectionHeaderHeight et estimatedSectionFooterHeight sur 0.

Source: en-tête flottant TableView iOS 11

31
jvdev7

J'ai eu un problème similaire avec l'animation de suppression de ligne de tableau sur iOS 11 faisant parfois défiler les cellules du tableau étrangement (iOS 10 fonctionnait très bien). Ce qui a aidé à mettre en œuvre cette méthode déléguée renvoyant la hauteur de ligne:

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

Après cela, iOS 10 et 11 fonctionnent très bien.

6
Chuck Boris

Dans iOS 11.2, j'ai eu une mauvaise animation après avoir supprimé une ligne à l'aide des actions de ligne standard. Je n'ai pu améliorer la situation qu'en encapsulant la suppression de ligne et le rejet d'action de ligne dans une CATransaction.

J'écarte d'abord les actions de ligne et j'attends que cette animation se termine avant de supprimer la ligne de la vue de table.

Au moins, il ne saute plus autour du décalage du contenu des vues de table, mais c'est une longue animation en deux étapes. Je cherche toujours une meilleure solution.

        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

Je l'ai corrigé en utilisant ce code:

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