[SWIFT] Je veux retourner la position de défilement de UITableView!

Xcode-12.0iOS-14.0Swift-5.3

introduction

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
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)

Méthode

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.

Résultat d'exécution 1

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
1 2 3 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. .. ..

Résultat d'exécution 2

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
l_1 l_2 l_3 l_4

Tous les motifs ont l'air bien: tada:

Résultat d'exécution 3

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.

cell

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
b_l_1 b_l_2 b_l_3 b_l_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

Conclusion

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

scroll

20201024 PostScript

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:

en conclusion

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

Je veux retourner la position de défilement de UITableView!
Je veux var_dump le contenu de l'intention
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Je souhaite renvoyer plusieurs valeurs de retour pour l'argument saisi
Je veux comprendre le flux des paramètres de demande de traitement Spring
Je veux revenir à l'écran précédent avec kotlin et java!
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
Je veux contrôler le message d'erreur par défaut de Spring Boot
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Bouton [Rails] pour revenir en haut de la page
Je veux tronquer après la virgule décimale
Je veux obtenir la valeur en Ruby
Je veux obtenir la valeur de Cell de manière transparente quel que soit CellType (Apache POI)
Je veux voir le contenu de Request sans dire quatre ou cinq
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Je veux appeler une méthode d'une autre classe
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
J'étais accro au record du modèle associé
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Je souhaite utiliser le mode sombre avec l'application SWT
Je veux appeler la méthode principale en utilisant la réflexion
[Commentaire approximatif] Je veux épouser la méthode du pluck
Je souhaite simplifier la sortie du journal sur Android
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
[Active Admin] Je souhaite spécifier l'étendue de la collection à afficher dans select_box
Je veux placer RadioButtons dans le même RadioGroup à n'importe quelle position de l'écran
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
9 Correspond à la valeur de retour
[Rails] [bootstrap] Je souhaite modifier la taille de la police de manière réactive
J'ai essayé de résumer les bases de kotlin et java
(´-`) .. oO (Je veux trouver facilement la sortie standard" Hello ".
Je veux amener Tomcat sur le serveur et démarrer l'application
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
Je veux appeler une méthode et compter le nombre
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]