web-dev-qa-db-fra.com

iOS 11 bogue UITableView

Le bug peut être reproduit en utilisant le repo ici .

J'ai un bogue étrange affectant mon projet dans iOS 11 dans mon UITableView . Le TableView en question est groupé, a des cellules extensibles. 

Il se produit de nombreux effets étranges qui n'apparaissent pas sur ma branche iOS 10:

  1. Titres se superpose
  2. problèmes de téléportation étranges lorsque la taille du contenu est supérieure à la taille du conteneur UITableView lorsque la réduction des cellules a lieu
  3. Téléportation étrange en haut de la table au début du défilement lorsque la taille du contenu dépasse la taille du conteneur
  4. Le dimensionnement des cellules est faux (assez souvent)

Il existe également un ticket qui semble lié sur le forum Apple Developers ici .

J'ai essayé sans succès:

if #available(iOS 11.0, *) {
    tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.never
}

J'essaie de trouver le comportement qui a été modifié dans iOS 11 et qui pourrait être à l'origine de ce problème. 

Toute aide serait appréciée!

edit: Couper les limites a aidé (mais à la fin, il cache/coupe le problème). Il me reste quelques problèmes (2, 3 et 4)… .. Lorsque j'essaie de déballer une cellule, celle-ci se téléporte au sommet au lieu de se dérouler sans à-coups… .. Lorsque je déballe une cellule et que je souhaite y accéder sans à-coups, il se téléporte en haut puis ne fait que défiler. (dû ajouter une section supplémentaire à afficher). 

Voici une vidéo du problème (avec iPhone 7 Plus, iOS 11, Xcode 9 Golden Master): https://youtu.be/XfxcmmPdeoU

 enter image description here

17
Swift Rabbit

Dans iOS 11, toutes les propriétés UITableView estimées (estimatedRowHeight, estimatedSectionHeaderHeight et estimatedSectionFooterHeight) sont définies par défaut sur UITableViewAutomaticDimension.

Je vois que pour vos cellules, tout va bien puisque vous retournez UITableViewAutomaticDimension dans heightForRow. Pour vos en-têtes de section et vos pieds de page, vous n’utilisez cependant pas le dimensionnement automatique. J'essaierais de désactiver tout le comportement de dimensionnement automatique de vos en-têtes/pieds de page en définissant estimatedSectionHeaderHeight et estimatedSectionFooterHeight sur 0.

Source: En-tête de table flottante iOS 11

23
jvdev7

Essayez cette solution, en supposant que vos IBOutlets et vos variables ne sont pas des données confidentielles dans StandardHeaderView.Swift:

    func toggleSection(section: SectionType) {
    self.sectionsOpened[section] = !self.sectionsOpened[section]!

    let sectionIndex = self.sections.index(of: section)!

    let indexPath = IndexPath(row: 0, section: sectionIndex)

    UIView.animate(withDuration: 0.25) {
        self.tableView.reloadRows(at: [indexPath], with: .automatic)
        if let headerView = self.tableView.headerView(forSection: sectionIndex) as? StandardHeaderView {
            headerView.configWith(title: headerView.headerTitleLabel.text!, isOpen: self.sectionsOpened[section]!, selector: headerView.selector)
        }

        self.tableView.scrollToRow(at: IndexPath(row: 0, section: sectionIndex), at: .top, animated: true)
    }
}
0
Patrick Bodet