2009-07-15 5 views
1

Les modèles de conception MVC/OOP indiquent que vous ne définissez pas de propriété en tant que telle, vous demandez à un objet de définir sa propriété. De même, dans Cocoa, vous ne dites pas à un objet quand il doit se dessiner. Le code de votre objet a détaillé COMMENT il va se dessiner ainsi nous faisons confiance aux cadres pour décider quand (pour la plupart) il devrait dessiner. Mais, quand il s'agit de l'animation dans Cocoa (en particulier Cocoa-Touch), il semble que nous devons maintenant prendre le contrôle de lorsque l'objet s'inspire du contrôleur de vue d'objets. Je ne peux pas envoyer de message à une sous-classe UIView lui demandant de changer une valeur et de la laisser tranquille sachant qu'elle va lentement (durée = X) animer elle-même à une nouvelle position, alpha, rotation, etc. selon la propriété changements. Ou puis-je? Fondamentalement, je suis à la recherche d'un moyen de définir la propriété, puis repartir. Au lieu de cela, il me semble que j'ai besoin d'enrouler le code qui appelle l'objet lui demandant de changer sa propriété avec un bloc d'animation quelconque "[UIView beginAnimations: nil context: NULL]; ... [UIView commitAnimations];" Je finis avec beaucoup, beaucoup de blocs d'animation dans mes contrôleurs de vue et aucun dans mes objets de vue ... Je suppose que je cherche juste quelqu'un pour vérifier que c'est ainsi que les choses sont faites et I ' Je ne néglige pas quelque chose. Je n'ai pas eu beaucoup plus loin que les animations UIView dans Cocoa-Touch, alors c'est peut-être mon problème et il est temps de creuser plus profondément?!?Ajustement de l'animation Cocoa dans les modèles MVC/OOP

Répondre

0

Vous avez raison: UIView n'anime pas ses changements de propriétés par défaut comme le fait CALayer, mais je ne pense pas que cela indique une rupture dans MVC. Il est approprié pour un contrôleur d'indiquer à une vue comment elle doit être transformée. C'est le rôle d'une classe de contrôleur aussi sûrement qu'il est approprié pour le contrôleur de connaître l'image correcte pour la vue et même de gérer la mise en page. Je suis d'accord que c'est un peu bizarre que vous appeliez -beginAnimations:context: sur la classe UIView plutôt que sur une instance, mais en pratique cela fonctionne beaucoup mieux de cette façon puisque vous pouvez animer plusieurs vues ensemble. Cela dit, si vous aviez une sous-classe UIView qui gérait la disposition de ses sous-vues, il n'y aurait rien de mal à permettre à UIView de gérer l'animation plutôt que de s'appuyer sur UIViewController pour le faire. Donc, c'est quelque chose qui pourrait aller n'importe où, mais dans la pratique, il va généralement dans le contrôleur que vous avez découvert.

J'utilise "MVC" ici dans le sens typique de Cocoa. Vous avez raison que cela peut ne pas être approprié dans un programme SmallTalk, mais SmallTalk Controllers ont un rôle beaucoup plus limité (gestion des événements d'entrée utilisateur). Cocoa étend considérablement le rôle des Contrôleurs dans MVC et je pense que c'est une amélioration, même si cela signifie qu'il y a maintenant des fonctions qui pourraient être dans le Contrôleur ou dans la Vue (et c'est l'une d'entre elles).

+0

Je n'ai pas beaucoup étudié CALayers. Je ne sais pas s'ils vont m'aider ici. Désolé pour ma confusion ... mais j'ai une sous-classe UIView. Je me demande s'il est possible de définir un état (par exemple fillColor = greenColor), puis de "s'éloigner". Cette uiview sait comment se dessiner et va remplir son chemin avec greenColor MAIS elle n'animera pas ce changement. Il devient instantanément vert. La seule façon que je peux trouver pour animer cela est de mettre en place des blocs d'animation dans le VC. – Meltemi

+0

Vous pouvez obtenir ce que vous voulez en demandant au calque UIView de faire le changement (aView.layer.backgroundColor), car le calque s'anime automatiquement. Cela dit, il n'y a rien de mal à configurer le bloc d'animation. –

+0

À mon avis, c'est une violation du principe MVC, qui est malheureusement inévitable dans le toucher du cacao. Le contrôleur devrait décider * quand * une vue devrait changer mais pas * comment * elle devrait changer car c'est la responsabilité de la vue. – adrin