UIScrollView animation de hauteur et contentOffset "saute" du contenu depuis le bas
Essayer de faire la même chose pour les Messages.application du comportement, j'ai un UIScrollView
et, en dessous, un champ de texte, et d'essayer de l'animer, de sorte que lorsque le clavier apparaît tout est déplacé vers le haut au-dessus du clavier à l'aide d'une contrainte qui se déplace dans le champ (et le UIScrollView
hauteur de changements aussi bien en raison de mise en page automatique) et aussi le réglage de la contentOffset
pour faire défiler vers le bas en même temps.
Le code accomplit le voulais être le résultat final, mais au cours de l'animation à droite lorsque le clavier de l'animation commence le défilement de l'affichage devient vide, puis le contenu défile de bas en haut, plutôt que de faire défiler à partir de la position où il était lors de l'animation a commencé.
L'animation est ceci:
- (void)updateKeyboardConstraint:(CGFloat)height animationDuration:(NSTimeInterval)duration {
self.keyboardHeight.constant = -height;
[self.view setNeedsUpdateConstraints];
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
[self.view layoutIfNeeded];
self.collectionView.contentOffset =
CGPointMake(0, self.collectionView.contentSize.height - self.collectionView.bounds.size.height);
} completion:nil];
}
Une vidéo du problème est disponible ici.
Merci!
source d'informationauteur abyx
Vous devez vous connecter pour publier un commentaire.
Il peut-être un bug dans UIKit. Il se produit quand il y a un changement simultané de
size
etcontentOffset
deUIScrollView
. Il serait intéressant de tester si ce comportement se produit également sans Mise en page Automatique.J'ai trouvé deux solutions de contournement pour ce problème.
À l'aide de contentInset (les Messages d'approche)
Comme on peut le voir dans l'application Messages,
UIScrollView
's la hauteur ne change pas lorsqu'un clavier est montré - les messages sont visibles sous le clavier. Vous pouvez faire la même façon. Supprimer la contrainte entreUICollectionView
et la vue qui contientUITextField
etUIButton
(je vais l'appelermessageComposeView
). Puis ajouter la contrainte entreUICollectionView
etBottom Layout Guide
. Garder la contrainte entremessageComposeView
et laBottom Layout Guide
. Ensuite, utilisezcontentInset
de conserver le dernier élément de laUICollectionView
visuellement au-dessus du clavier. J'ai fait de la manière suivante:Ici
self.bottomSpaceConstraint
est une contrainte entremessageComposeView
etBottom Layout Guide
. Voici la vidéo montrant comment il fonctionne.Mise à JOUR 1: Voici mon source du projet sur GitHub. Ce projet est un peu simplifié. Je devrais avoir pris en considération les options passées à la notification dans
- (void)keyboardWillShow:(NSNotification *)notif
.Effectuer des changements dans une file d'attente
Pas une solution exacte, mais le défilement fonctionne très bien si vous le déplacez vers la fin du bloc:
Il faut 0,25 s pour le clavier de montrer, de sorte que la différence entre les débuts de l'animation peut être perceptible. Les Animations peuvent également être effectuée dans l'ordre inverse.
Mise à JOUR 2: j'ai aussi remarqué que les OP code fonctionne très bien avec ce changement:
mais seulement quand
contentSize
'sheight
est à moins de valeur fixe (dans mon cas, autour de800
mais ma mise en page peut être un peu différente).Au final, je pense que l'approche que j'ai présenté dans
Using contentInset (the Messages approach)
est mieux que le redimensionnementUICollectionView
. Lors de l'utilisation decontentInset
nous avons également obtenir de la visibilité des éléments sous le clavier. Il s'inscrit certainement l'iOS 7 style mieux.J'ai eu un problème similaire -- lors de l'animation de l'image et de compenser le contenu devrait "sauter" à droite avant d'animer en position, et l'ENSEMBLE de la solution est simplement d'ajouter
UIViewAnimationOptionBeginFromCurrentState
à l'animation des options. Voila!Ne le
setNeedsUpdateConstraints
vraiment nécessaire? n'est pas mise en page automatique de le faire automatiquement?Si pas, je vous suggère de faire tout le redimensionnement de l'animation à elle seule, sans l'aide de mise en page automatique. il semble que le problème est lorsque vous essayez de faire les deux animations ensemble (mais il n'est pas sur le même temps)
Je ne suis pas certain que c'est exactement le comportement que vous voulez, mais peut-être cela peut vous donner un coup de pouce dans la bonne direction : Projet Github
Ce que j'ai fait a été de mettre en place deux contraintes, l'une pour le champ de texte (pour le guidage en bas) et l'autre pour le défilement de la vue (pour le textfield).
Puis lors de l'appel de l'animation j'anime le "centre" de la propriété de ces deux éléments, pas la contentOffset, et je considère la valeur de l'animation et de la valeur de la contrainte séparément.
Résultat Final est ici:
Vidéo Youtube
Essayez de supprimer le
[self.view layoutIfNeeded]
ligne et de voir si le problème persiste ou si d'autres problèmes apparaissent, et si oui, ils regardent liés en aucune façon.Aussi, c'est toujours une bonne idée pour réinitialiser la position de votre point de vue juste avant l'animation. Donc, essayez de régler le décalage normal juste avant l'animation en ligne (et peut-être même appeler le
layoutIfNeeded
méthode d') Sorte de placer le tout pour le tout juste avant de commencer l'animation.J'ai eu le même problème, j'ai été en mesure de le résoudre en s'inscrivant
NSNotifications
pour clavier/le masquage et l'affichage. Je suis en fournissant le code pour le même. Espérons qu'il saura vous aider.il suffit de déclarer BOOL isMovedUp dans votre .la classe h
Dans Le ViewDidLoad