J'ai un UITableView
qui est rempli de cellules de hauteur variable. Je voudrais que le tableau défile vers le bas lorsque la vue est poussée dans la vue.
J'ai actuellement la fonction suivante
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log est un tableau mutable contenant les objets qui composent le contenu de chaque cellule.
Le code ci-dessus fonctionne bien, viewDidAppear
mais cela a pour effet secondaire malheureux d'afficher le haut du tableau lorsque la vue apparaît pour la première fois, puis de sauter vers le bas. Je préférerais que le table view
puisse être fait défiler vers le bas avant d'apparaître.
J'ai essayé le défilement viewWillAppear
et viewDidLoad
mais dans les deux cas, les données n'ont pas encore été chargées dans la table et les deux lancent une exception.
Toute orientation serait très appréciée, même s'il ne s'agit que de me dire ce que j'ai, c'est tout ce qui est possible.
la source
[table reloadData];
CGPoint(x: 0, y: tableView.contentSize.height)
?Je pense que le moyen le plus simple est le suivant:
Version Swift 3:
la source
messages.count
par le déjà implémentémyTableView.dataSource!.tableView(myTableView, numberOfRowsInSection: 0)
. Oui, c'est plus long, mais cela peut éviter la répétition du code. Vous devez également gérer l'option facultativedataSource
(ne forcez pas le déballage comme dans cet exemple).D'après la réponse de Jacob, voici le code:
la source
UIEdgeInsetsInsetRect(self.messagesTableView.frame, self.messagesTableView.safeAreaInsets).height
Si vous avez besoin de faire défiler jusqu'à la fin EXACT du contenu, vous pouvez le faire comme ceci:
la source
yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
:? Merci.self.tableView.contentSize.height
contenu de la vue de table peut ne pas être visible, car vous faites défiler sous le contenu. Par conséquent, vous devez faire défiler jusqu'à un "espace de vue de tableau visible" au-dessus de la fin de la vue de tableau.J'utilise la mise en page automatique et aucune des réponses n'a fonctionné pour moi. Voici ma solution qui a finalement fonctionné:
la source
setContentOffset
à un autre moment lorsque les données ont été récupérées et la tableview rechargée?CGFLOAT_MAX
j'ai utilisécontentSize.height - frame.height + contentInset.bottom
lors de la définition du décalage de contenu initial. L'utilisation aCGFLOAT_MAX
semblé gâcher pour moi.La solution acceptée par @JacobRelkin ne fonctionnait pas pour moi dans iOS 7.0 en utilisant Auto Layout.
J'ai une sous-classe personnalisée de
UIViewController
et ajouté une variable d'instance en_tableView
tant que sous-vue de sonview
. Je me suis positionné en_tableView
utilisant la mise en page automatique. J'ai essayé d'appeler cette méthode à la finviewDidLoad
et même dansviewWillAppear:
. Aucun des deux n'a fonctionné.J'ai donc ajouté la méthode suivante à ma sous-classe personnalisée de
UIViewController
.Appel
[self tableViewScrollToBottomAnimated:NO]
à la fin desviewDidLoad
travaux. Malheureusement, il provoque égalementtableView:heightForRowAtIndexPath:
un appel trois fois pour chaque cellule.la source
Voici une extension que j'ai implémentée dans Swift 2.0. Ces fonctions doivent être appelées après le
tableview
chargement de:la source
Détails
Code
Usage
Échantillon complet
la source
En fait, une façon plus rapide de le faire est:
travail parfait pour moi.
la source
Je voulais que le tableau se charge avec la fin du tableau indiqué dans le cadre. J'ai trouvé en utilisant
ne fonctionnait pas car cela donnait une erreur lorsque la hauteur de la table était inférieure à la hauteur du cadre. Notez que mon tableau n'a qu'une seule section.
La solution qui a fonctionné pour moi a été d'implémenter le code suivant dans viewWillAppear:
Le BOOL ivar initialLoad est défini sur TRUE dans viewDidLoad.
la source
scrollToRowAtIndexPath
du tout? Vous appelez déjàsetContentOffset
après, ce qui pourrait rendre ce premier appel inutile.Pour Swift:
la source
Vous devriez utiliser à la
UITableViewScrollPositionBottom
place.la source
Pour Swift 3 (Xcode 8.1):
la source
Est bien sûr un bug. Probablement quelque part dans votre code que vous utilisez
table.estimatedRowHeight = value
(par exemple 100). Remplacez cette valeur par la valeur la plus élevée que vous pensez qu'une hauteur de ligne pourrait obtenir , par exemple 500 .. Cela devrait résoudre le problème en combinaison avec le code suivant:la source
Après beaucoup de bidouilles, voici ce qui a fonctionné pour moi:
La clé s'est avérée ne pas s'enrouler à l'
scrollToRowAtIndexPath
intérieur dedispatch_async
comme certains l'ont suggéré, mais simplement la suivre avec un appel àlayoutIfNeeded
.Ma compréhension de cela est que l'appel de la méthode scroll dans le thread actuel garantit que le décalage de défilement est défini immédiatement, avant l'affichage de la vue. Lors de l'envoi vers le thread principal, la vue s'affichait un instant avant que le défilement ne prenne effet.
(Notez également que vous avez besoin du
viewHasAppeared
drapeau car vous ne le souhaitez pas àgoToBottom
chaque fois qu'ilviewDidLayoutSubviews
est appelé. Il est appelé par exemple chaque fois que l'orientation change.)la source
En utilisant les solutions ci-dessus, cela défilera vers le bas de votre tableau (uniquement si le contenu du tableau est chargé en premier):
la source
Dans Swift 3.0
la source
Si vous devez charger les données de manière asynchrone avant de faire défiler vers le bas, voici la solution possible:
la source
Fonction sur Swift 3 défiler vers le bas
la source
tu devrais ajouter
ou il ne défilera pas vers le bas.
la source
Utilisez ce code simple pour faire défiler le tableau
la source
Merci Jacob pour la réponse. vraiment utile si quelqu'un d'intéressant avec la version monotouch c #
la source
Dans iOS, cela a bien fonctionné pour moi
Il doit être appelé de
viewDidLayoutSubviews
la source
[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) animé: OUI];
la source
La réponse acceptée ne fonctionnait pas avec ma table (milliers de lignes, chargement dynamique) mais le code ci-dessous fonctionne:
la source
Pas besoin de défilement, vous pouvez simplement le faire en utilisant ce code:
la source
Si vous configurez frame pour tableview par programme, assurez-vous que vous définissez correctement frame.
la source
Dans Swift, vous avez juste besoin
pour le faire défiler automatiquement vers le bouton
la source
Dans swift 3.0 Si vous voulez aller à n'importe quelle cellule particulière de tableview Changer l'index de cellule Valeur comme changer la valeur "self.yourArr.count".
la source
Je pense que les anciennes solutions ne fonctionnent pas avec swift3.
Si vous connaissez le nombre de lignes dans le tableau, vous pouvez utiliser:
la source