layoutSubviews pendant une animation?
J'ai un UIView
avec un tas de sous-vues, tous positionnés à l'aide de layoutSubviews
. Lorsque le view
est redimensionné, les positions relatives à tout changement. J'aimerais que ces calculs se produire pendant l'animation de redimensionnement (à l'aide de +[UIView beginAnimations:]
appels). Cela ne semble pas être le cas. Des idées?
source d'informationauteur Ben Gottlieb
Vous devez vous connecter pour publier un commentaire.
Hypothèse: Vous voulez avoir de multiples étapes de l'animation (c'est à dire la position ne change pas de façon linéaire avec la taille de l'image).
Ce n'est pas possible avec un seul "standard" UIView animations. Pourquoi? Le cadre/limites est qu'une seule fois.
Core Animation a trois "couche arbres":
UIView est un (assez mince) wrapper autour de la couche modèle. Au cours d'une UIView animation, Core Animation des mises à jour de la présentation/du rendu de l'arbre — l'arbre du modèle représente le point de terminaison des animations. Le résultat est que votre code (pour la plupart) traiter des animations instantanées de déplacement de la vue de A à B se déplace instantanément à B; le changement arrive juste à être animé à l'utilisateur.
Il y a de plus compliqué les choses que vous pouvez faire avec CALayer/CAAnimation directement, mais je n'ai pas étudié ce point.
Vous pourriez chaîne de multiples animations ensemble à l'aide d' -[UIView setAnimationDidStopSelector:]. (Vous pouvez également essayer d'utiliser de multiples animations avec setAnimationDelay:, mais je ne suis pas sûr de ce qui se passe avec de nombreuses animations sur le même bien; vous pourriez avoir de la chance avec setAnimationBeginsFromCurrentState:.)
Si vous voulez vraiment un contrôle précis, CADisplayLink (OS 3.1+) est une horloge qui se déclenche après chaque actualisation de l'écran. Option de repli (3.0) est d'utiliser un NSTimer à 30/60 Hz.
Je sais que c'est une vieille question, mais ce code fonctionne pour moi, très bien (adapté pour votre exemple de modification de l'image).
Bien sûr, vous pouvez appeler cette méthode à partir d'un autre objet. Le "truc" est d'appeler layoutIfNeeded (ou layoutSubviews directement - de la même chose, si Vous modifiez le cadre de la setNeedsLayout est appelé).
Comme tc. joliment expliqué la "couche d'arbres", il Vous suffit de la force de la couche de présentation pour afficher la dernière étape du modèle de couche avec animation.
L'avantage de cette méthode réside dans la possibilité de contrôler le moment où l'image/de limites changement est animé et quand c'est instantané.
Espère que cela aide quelqu'un:).
Remplir @GrizzlyNetch de réponse, vous pouvez définir la
UIViewAnimationOptionLayoutSubviews
animation option, de sorte que vous n'avez pas besoin d'appelerlayoutIfNeeded
:L'affichage de l'exhaustivité. Merci à tc. pour expliquer que ce que je veux faire, exactement, n'est pas pris en charge par le Noyau de l'Animation.
J'ai finalement venu avec une solution raisonnable. Plutôt que de mise en page de mon sous-vues en layoutSubviews, je le fais en setBounds:. Puis, quand j'ai enroulez -setBounds: appel à une UIView +beginAnimations: bloc, ces appels de positionnement sont également animés, et le résultat final est tout correctement de l'animation à l'endroit où il devrait dieu.