web-dev-qa-db-fra.com

En-tête flottant TableView iOS 11

Avoir une application avec plusieurs sections, quelques lignes par section lorsqu'elle est "développée", aucune lorsqu'elle est "réduite". Chaque section a un en-tête de section, les réutilisait en utilisant une sous-classe de UITableViewHeaderFooterView etc. Jusqu'ici tout va bien.

Puis dans iOS 11:

Screenshot describing the issue

J'ai utilisé le débogueur visuel et confirmé que mon en-tête de section flottait. Toutes les lignes sous l'en-tête s'affichent correctement, les autres en-têtes s'affichent bien.

Dans un effort pour restaurer la raison, j'ai jeté toute la logique de réutilisation pour l'en-tête et je les ai juste faites par programme. Pareil pareil. Tous fonctionnent avant iOS 11, flottent toujours dans iOS 11. La section qui flotte semble changer à chaque fois, alors voilà.

Des idées?

12
VDub19

Je suis juste tombé sur un problème similaire et j'ai trouvé la discussion sur ce problème qui a fonctionné pour moi:

self.tableView.estimatedRowHeight = 0
self.tableView.estimatedSectionHeaderHeight = 0
self.tableView.estimatedSectionFooterHeight = 0

Il semble que le comportement par défaut de UITableView ait changé dans iOS 11 pour utiliser les hauteurs estimées. Les notes de version pour iOS 11 beta 2 disent:

Les vues de tableau utilisent désormais les hauteurs estimées par défaut, ce qui signifie également que les cellules et les vues d'en-tête/pied de section sont désormais auto-dimensionnées par défaut. La valeur par défaut des propriétés estimationRowHeight, estimationSectionHeaderHeight et estimationSectionFooterHeight est désormais UITableViewAutomaticDimension, ce qui signifie que la vue de table sélectionne une hauteur estimée à utiliser. Vous devriez toujours fournir une estimation plus précise pour chaque propriété si possible, qui est votre meilleure estimation de la valeur moyenne des hauteurs réelles. Si vous disposez d'un code de vue de table existant qui se comporte différemment lorsque vous créez votre application avec le SDK iOS 11 et que vous ne souhaitez pas adopter le dimensionnement automatique, vous pouvez restaurer le comportement précédent en désactivant les hauteurs estimées en définissant une valeur de zéro pour chaque propriété de hauteur estimée. (30197915)

voir aussi les notes de version beta 2 en miroir ici .

48
ahmedre

Si vous souhaitez apporter des modifications comme dans ahmedre réponse pour l'application entière, vous pouvez définir ces propriétés dans AppDelegate didFinishLaunchingWithOptions

UITableView.appearance().estimatedRowHeight = 0
UITableView.appearance().estimatedSectionHeaderHeight = 0
UITableView.appearance().estimatedSectionFooterHeight = 0
3
A.Mysik

Je ne sais pas pourquoi dans mon cas, la réponse @ahmedre ne fonctionne pas ...

Donc, ma réponse peut vous aider si vous définissez toutes les propriétés estimées à 0 ne fonctionne pas non plus:

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    return 0.1
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 0.1
}
2
Arco

Essayez de changer le style de table de simple à groupé.

1
Anas Alhasani