8
votes

Comment les blocs d'animation IOS fonctionnent-ils?

in ios, vous pouvez Animate Afficher les objets en utilisant Blocs d'animation:

[UIView animateWithDuration:1.0 animations:^{

        firstView.alpha = 0.0;

        secondView.alpha = 1.0;

}];


0 commentaires

3 Réponses :


8
votes

Oui, le bloc est réellement invoqué - alors cela change immédiatement les propriétés de la vue. Les Setteurs de propriétés UIVIEW sont responsables de la vue si l'ensemble a été utilisé dans un contexte d'animation - le cas échéant, ils calculent les cadres d'animation, etc. Utilisation de corpores et de baseGraphics.

Si vous mettez un code de non-animation dans ces blocs, rien de spécial ne se produira - le bloc sera exécuté immédiatement.


5 commentaires

Aha! Donc, à l'intérieur de UIView, il y a du code qui inspecte la pile d'appels et s'il est appelé à partir d'un bloc d'animation, il fait quelque chose de tout à fait différent de la mise à jour directement?


Je ne suis pas sûr qu'il inspecte la pile d'appels; Il devrait plutôt être les méthodes d'animation qui configurent une sorte de contexte interne.


Aha! Mais alors l'UIView vérifie ce contexte et agit en conséquence?


Que se passe-t-il si j'appelle la même propriété deux fois dans le même bloc? Ou propriétés contradictoires? Dire firstview.alpha = 0.0; firstview.alpha = 0,25; est-ce qu'ils sont en file d'attente? Ou écraser l'autre?


Aucun conflit: ce dernier sera l'efficacité, le premier se fait défoncer.



1
votes

Apple ne parle pas vraiment des détails Nitty-Gritty de la façon dont cela fonctionne, mais voici ce que je pense arrive:

Le système ajoute des observateurs KVO sur toutes les propriétés animées d'une vue lorsque la vue est ajoutée à la hiérarchie de la vue.

Lorsque votre bloc d'animation exécute, le système définit un état qui veille aux notifications KVO sur ces propriétés. Le code qui est invoqué puis crée et ajoute les objets de caanimation appropriés à chaque couche de la vue affectée.


2 commentaires

Cela séparerait le code d'animation de la mise en œuvre de la vue gentiment. Est-il possible pour l'observateur KVO de supprimer le réglage de la propriété (et plutôt des animations de la file d'attente)? En outre, tandis qu'Apple ne parle pas de cela, existe-t-il un moyen d'inspecter / instrument un système d'exécution pour voir ce qui se passe?


Vous n'avez pas besoin de supprimer la définition de la propriété. L'animation principale est effectuée en affichant une couche de présentation, qui est indépendante des paramètres réels du calque. En fait, avec des objets de caanimation, l'une des façons d'animer un changement consiste à définir la propriété d'une couche sans animation, puis soumettez une caanimation qui anime ce changement. Une fois l'animation terminée, elle est supprimée et que le calque est rendu à son état final. Si vous soumettez une caanimation sans changer la propriété sous-jacente, la couche s'enfonce vers son état d'origine une fois l'animation terminée.



6
votes

Il est instructif de regarder le code équivalent avant les blocs: xxx

Vous voyez donc, même avant les blocs, les propriétés à modifier sont également définies directement; Cependant, ils ne prennent pas d'effet immédiatement (ils sont animés).

Comment ça marche? Vraisemblablement lorsque vous définissez une propriété à la vue, il vérifie si vous exécutez Beguanimations mais pas commitionnements , et ne prend pas effet immédiatement s'il est (mais plutôt l'ajoute à la liste des choses à animer pour cette animation).

Alors, quelle version de blocs est très simple dans le contexte de la version de pré-blocs: vous pouvez simplement y penser comme exécutant l'animation Bloquer à l'intérieur Beginanimations et Comprimanimations Lignes.


0 commentaires