Parfois, je veux faire défiler vers le haut lorsque je fais reloadData ()
sur ʻUITableView`. Mais c'est assez ennuyeux. .. ..
J'ai essayé différentes méthodes, je vais donc l'écrire sous forme de mémorandum.
Ce que je veux faire, c'est "Je veux recharger + faire défiler la position vers le haut lorsque le bouton est enfoncé"!
Comme ça (avant est affiché en bas et après est rechargé + défilement vers le haut d'avant)
before | after |
---|---|
![]() |
![]() |
Le tableau est un tableau de style «groupé» où l'en-tête écrit dans Dernier article disparaît et apparaît! (Avant cache l'en-tête, après montre l'en-tête)
Il y a setContetnOffset
et scrollToRow
pour faire défiler le tableau vers le haut, et je pense qu'il y a 4 modèles selon que vous faites défiler avant ou après reloadData
.
La mise en œuvre ressemble à ceci
//Motif 1 (setContentOffset défilement vers l'avant)
tableView.setContentOffset(.zero, animated: false)
tableView.reloadData()
//Motif 2 (défilement vers l'avant scrollToRow)
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
tableView.reloadData()
//Motif 3 (défilement après setContentOffset)
tableView.reloadData()
tableView.setContentOffset(.zero, animated: false)
//Motif 4 (scrollToRow puis scroll)
tableView.reloadData()
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
Le résultat ressemble à ceci
Modèle 1 | Motif 2 | Motif 3 | Motif 4 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Les motifs 1 et 4 (mais sans faire défiler jusqu'à l'en-tête car il s'agit d'un paramètre de ligne) semblent être bons, mais les motifs 2 et 3 sont à mi-chemin. .. ..
Je ne sais pas ce que c'est, mais la taille du contenu n'est pas fixe pour le moment = je pense que le résultat sera comme ci-dessus car la mise en page est à mi-chemin, dois-je appeler layoutIfNeeded ()
? Alors je l'ai implémenté comme suit.
//Motif 1 (setContentOffset défilement vers l'avant)
tableView.setContentOffset(.zero, animated: false)
tableView.layoutIfNeeded()
tableView.reloadData()
//Motif 2 (scrollToRow défilement vers l'avant)
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
tableView.layoutIfNeeded()
tableView.reloadData()
//Motif 3 (défilement après setContentOffset)
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.setContentOffset(.zero, animated: false)
//Motif 4 (scrollToRow puis scroll)
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .top, animated: false)
Le résultat ressemble à ceci
Modèle 1 | Motif 2 | Modèle 3 | Motif 4 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Tous les motifs ont l'air bien: tada:
En appelant layoutIfNeeded ()
, chaque comportement est comme prévu, mais c'est ambigu! Il n'y a pas de problème si la hauteur de cellule est fixe, mais si la hauteur de cellule est variable, c'est un peu. .. .. : confondu:
Préparez les deux modèles de cellules suivants.
Lorsque j'essaye le traitement du résultat d'exécution 2, le résultat ressemble à ceci (Au fait, s'il n'y a pas de modèle layoutIfNeeded
, le défilement est à mi-chemin sauf pour le modèle 4)
Modèle 1 | Motif 2 | Modèle 3 | Motif 4 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Autre que le modèle 3, cela semble fonctionner: clap: Probablement le modèle 3 fonctionnera si vous renvoyez une valeur appropriée avec tableView (_: estiméHeightForRowAt:)
. Deux modèles conviennent, mais si la disposition automatique est impliquée ici, divers calculs de hauteur seront gênants. .. ..
Concernant la hauteur de la cellule, diverses choses ont été soigneusement décrites dans l'article suivant, donc veuillez vous y référer (je ne sais pas grand chose ...) Ce qui doit être défini pour rowHeight et estiméRowHeight de UITableView
Cette fois, j'ai choisi ce qui suit car je voulais faire défiler jusqu'à l'en-tête car il était difficile à calculer. (Peut-être que c'est bon: v :)
//Motif 1 (setContentOffset défilement vers l'avant)
tableView.setContentOffset(.zero, animated: false)
tableView.layoutIfNeeded()
tableView.reloadData()
L'opération est comme ça
Commentaire, mais il semble que vous devriez changer la position du défilement de .top
à .bottom
comme indiqué ci-dessous: tada:
tableView.reloadData()
tableView.scrollToRow(at: .init(row: 0, section: 0), at: .bottom, animated: false)
Je n'ai même pas besoin de layoutIfNeeded
et je pense que c'est le meilleur: détendu:
La combinaison de reloadData
et de défilement vers le haut est assez courante, mais que dois-je faire après tout? Je m'inquiète toujours. .. ..
Il semble y avoir la méthode suivante.
iOS TableView reload and scroll top
Si vous connaissez un autre bon moyen, apprenez-moi s'il vous plaît: lever_hands:
Recommended Posts