Comment faire UIScrollView
défiler vers le bas dans mon code? Ou d'une manière plus générique, à n'importe quel point d'une sous-vue?
298
Comment faire UIScrollView
défiler vers le bas dans mon code? Ou d'une manière plus générique, à n'importe quel point d'une sous-vue?
Vous pouvez utiliser la setContentOffset:animated:
fonction UIScrollView pour faire défiler jusqu'à n'importe quelle partie de la vue de contenu. Voici un code qui défilerait vers le bas, en supposant que votre scrollView est self.scrollView
:
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
J'espère que cela pourra aider!
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
contentSize
est inférieur àbounds
. Il devrait donc en être ainsi:scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
let bottomOffsetY = max(collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom, 0)
Version rapide de la réponse acceptée pour un copier-coller facile:
la source
Solution la plus simple:
la source
Juste une amélioration de la réponse existante.
Il prend également en charge l'encart inférieur (au cas où vous l'utiliseriez pour ajuster votre vue de défilement lorsque le clavier est visible)
la source
Une implémentation rapide:
utilise le:
la source
La définition du décalage du contenu à la hauteur de la taille du contenu est incorrecte: il fait défiler le bas du contenu vers le haut de la vue de défilement, et donc hors de vue.
La bonne solution consiste à faire défiler le bas du contenu vers le bas de la vue de défilement, comme ceci (
sv
est le UIScrollView):la source
if (sv.contentOffset.y + csz.height > bsz.height) {
?setContentOffset:
commande qui est importante.Une solution Swift 2.2, prenant
contentInset
en compteCela devrait être dans une extension
Notez que vous voudrez peut-être vérifier si
bottomOffset.y > 0
avant de faire défilerla source
Et si
contentSize
est inférieur àbounds
?Pour Swift, c'est:
la source
Faire défiler vers le haut
Faire défiler vers le bas
la source
J'ai également trouvé un autre moyen utile de le faire dans le cas où vous utilisez un UITableview (qui est une sous-classe de UIScrollView):
la source
Utilisation de la
setContentOffset:animated:
fonction UIScrollView pour faire défiler vers le bas dans Swift.la source
Il semble que toutes les réponses ici n'aient pas pris en compte la zone de sécurité. Depuis iOS 11, l'iPhone X a introduit une zone de sécurité. Cela peut affecter les scrollView
contentInset
.Pour iOS 11 et supérieur, pour faire défiler correctement vers le bas avec l'encart de contenu inclus. Vous devez utiliser à la
adjustedContentInset
place decontentInset
. Vérifiez ce code:contentOffset.x
):Références:
la source
Avec un (facultatif)
footerView
etcontentInset
, la solution est:la source
Rapide:
Vous pouvez utiliser une extension comme celle-ci:
Utilisation:
la source
valdyr, j'espère que cela vous aidera:
la source
Catégorie à la rescousse!
Ajoutez ceci à un en-tête d'utilitaire partagé quelque part:
Et puis à cette implémentation de l'utilitaire:
Ensuite, implémentez-le où vous voulez, par exemple:
la source
Pour ScrollView horizontal
Si vous m'aimez a un ScrollView horizontal et que vous souhaitez faire défiler jusqu'à la fin (dans mon cas à l'extrême droite), vous devez modifier certaines parties de la réponse acceptée:
Objectif c
Rapide
la source
Si vous changez en quelque sorte scrollView contentSize (par exemple, ajoutez quelque chose à stackView qui se trouve à l'intérieur de scrollView), vous devez appeler
scrollView.layoutIfNeeded()
avant de faire défiler, sinon cela ne fait rien.Exemple:
la source
Un bon moyen de s'assurer que le bas de votre contenu est visible est d'utiliser la formule:
Cela garantit que le bord inférieur de votre contenu est toujours au niveau ou au-dessus du bord inférieur de la vue. Le
MIN(0, ...)
est requis carUITableView
(et probablementUIScrollView
) garantitcontentOffsetY >= 0
que l'utilisateur essaie de faire défiler en claquant visiblementcontentOffsetY = 0
. Cela semble assez étrange pour l'utilisateur.Le code pour implémenter ceci est:
la source
Si vous n'avez pas besoin d'animation, cela fonctionne:
la source
Bien que la
Matt
solution me semble correcte, vous devez également prendre en compte l'encart de la vue de collection s'il y en a un qui a été configuré.Le code adapté sera:
la source
En bref:
la source
Solution pour faire défiler jusqu'au dernier élément d'une table Voir:
Swift 3:
la source
N'a pas travaillé pour moi, quand j'ai essayé de l' utiliser dans
UITableViewController
leself.tableView
(iOS 4.1)
, après avoir ajoutéfooterView
. Il défile hors des frontières, montrant un écran noir.Solution alternative:
la source
la source
J'ai trouvé que
contentSize
cela ne reflète pas vraiment la taille réelle du texte, donc lorsque vous essayez de faire défiler vers le bas, il sera un peu éteint. La meilleure façon de déterminer la taille du contenu réel est en fait d'utiliser laNSLayoutManager
de »usedRectForTextContainer:
méthode:Pour déterminer la quantité de texte réellement affichée dans le
UITextView
, vous pouvez le calculer en soustrayant les encarts du conteneur de texte de la hauteur du cadre.Ensuite, il devient facile de faire défiler:
Quelques chiffres pour référence sur ce que les différentes tailles représentent pour un vide
UITextView
.la source
Étendez UIScrollView pour ajouter une méthode scrollToBottom:
la source
Version Xamarin.iOS de la réponse acceptée
la source
Version Xamarin.iOS pour
UICollectionView
la réponse acceptée pour faciliter le copier-collerla source