CABasicAnimation pas de l'animation de ma propriété
J'ai essayé de comprendre quel est le problème avec mon animation et je n'ai toujours pas le comprendre. Je pense qu'il doit être vraiment simple, mais il y a probablement quelque chose qui me manque, même après avoir lu beaucoup d'exemples et de la documentation.
Mon problème vient à l'origine la forme le fait que sur l'iPhone, vous ne pouvez pas redimensionner les couches automatiquement (avec la vue). La documentation dit le contraire mais il n'y a pas de autoresizeMask pour le calque dans le Sdk. J'ai donc décidé de faire un peu de solution de contournement et d'animer la couche moi-même.
J'ai ce simple morceau de code qui devrait faire un simple redimensionnement de l'animation. Les valeurs sont bonnes et j'ai même mis le délégué afin de retrouver la trace si l'anim de début/fin.
//I've got a property named layerImage (which is a CALayer)
- (void)animateTestWithFrame:(CGRect)value {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"layerImage.frame"];
animation.duration = 1;
animation.fromValue = [NSValue valueWithCGRect:self.frame];
animation.toValue = [NSValue valueWithCGRect:value];
animation.removedOnCompletion = YES;
animation.delegate = self;
[self.layer addAnimation:animation forKey:@"layerImage.frame"];
}
Alors, des idées? (Ce point de vue qui contient le code est la sous-vue d'une sous-vue de la fenêtre si ça pourrait faire une différence)
--- EDIT ---
Il semble que le cadre n'est pas animable par CABasicAnimation et de la propriété nommée "cadre". Lors de l'utilisation de limites, j'ai un peu de résultat étrange, mais au moins je suis arriver quelque chose. Continuera d'enquêter sur cette.
OriginalL'auteur Sauleil | 2010-07-19
Vous devez vous connecter pour publier un commentaire.
Il est donc bon que vous avez compris les choses ici, mais votre réponse à votre propre question a un certain nombre d'inexactitudes. Permettez-moi de corriger un peu les choses:
Le cadre de la propriété peut être animés-tout simplement pas de manière explicite de l'animation. Si vous effectuez les opérations suivantes pour une couche autre que la racine de la couche d'un point de vue, le cadre animer parfaitement:
Rappelez-vous que la définition d'une propriété sur une couche de animer ce changement de propriété par défaut. En fait, vous devez désactiver les animations sur un changement de propriété si vous ne voulez pas à s'animer. (Bien sûr, cela est vrai uniquement si vous animer un calque autre que la racine de la couche d'un point de vue.) Vous avez raison dans l'animation de la position et de limites, si vous avez besoin d'utiliser explicite de l'animation.
Vous peut animer le cadre sur une UIView utilisation implicite de l'animation:
Cela va animer à partir de l'affichage de l'image en cours (limites et la position) pour x = 45.0, y = 45.0, w = 100.0, h = 100.0.
Il semble que vous peut-être aussi de l'incompréhension de la différence entre, d'une animation et d'une couche. Vous ajoutez des animations pour les couches, mais l'ajout d'une animation à une couche n'est pas automatiquement la propriété que vous animez.
CALayers sont des objets de modèle. Ils contiennent des informations sur la couche qui obtient finalement rendu à l'écran. Vous doit ensemble d'une couche de propriété si vous le voulez bien pour avoir cette valeur. Si vous avez simplement animer la propriété, ce n'est qu'une représentation visuelle et non pas réelle, c'est-à-dire c'est pourquoi la valeur revient à la valeur d'origine de la couche, parce que vous n'avez jamais réellement changé.
Ce qui m'amène au point suivant. Vous avez dit:
Ce n'est pas tout à fait exact. Ces deux valeurs à l'origine de l'animation de rester à sa position finale visuellement, cependant, la couche réelle de valeurs n'ont pas changé. Ils sont toujours exactement les mêmes valeurs qu'ils ont été quand vous avez commencé à l'animation. En général (à quelques exceptions près) que vous ne souhaitez pas utiliser ces deux paramètres, car ils sont visual seulement. Ce que vous voulez est pour que la couche de la valeur de la propriété que vous animez.
Dire, par exemple, que vous souhaitez animer la position de votre calque à l'aide d'un explicite de l'animation. Voici le code que vous voulez:
Vous pouvez également envisager d'animation de regroupement. Avec une animation de groupe, vous pouvez regrouper plusieurs animations ensemble et de contrôler la manière dont ils se rapportent les uns aux autres. Dans votre cas, la durée de vos limites et de la position des animations sont les mêmes, de sorte que ce que vous essayez de faire fonctionnent correctement sans un groupe, mais si vous voulez pour compenser le départ des animations, par exemple vous ne souhaitez pas que la position de l'animation de démarrage jusqu'à ce qu'une seconde ou deux dans le cadre de l'animation, vous pouvez échelonner entre eux par la mise en au beginTime valeur de la position de l'animation.
Enfin, je serais curieux de savoir pourquoi vous ne pouvez pas utiliser l'implicite des animations disponibles sur UIView. - Je les utiliser dans la grande majorité de la Core Animation code j'écris et que je ne vois pas pourquoi ce ne serait pas travailler pour votre situation.
Meilleures salutations.
Belle réponse! Très détaillé. Je vous ai mis 2 points dans le cas où je le pouvais.
OriginalL'auteur Matt Long
Le chemin de clé doit être le chemin d'accès clé de la propriété, et non le nom de l'objet.
Utiliser cette
au lieu de cela
Et juste BTW, quand vous ajouter une animation à un calque, la clé doen pas dire que la clé propriété à animer. Juste la clé (nom) que vous souhaitez que cette animation (cela fait référence à la dernière ligne de votre code)
Si vous faites de l'animation sur un objet différent de soi (dans la méthode), la juste utilisation [self.layerImage.couche addAnimation:animation ...]
Encore une chose: je ne comprends pas pourquoi vous utilisez le CABasicAnimation ici. UIView animations ferait.
À l'aide de UIView ne semble pas animer correctement. J'ai juste essayé encore et encore des comportements bizarres. (pas de l'animation et de la taille ne semble pas correcte). Je vais faire d'autres tests afin de comprendre ce qu'il se passe.
Le mauvais comportement était un bug de mon côté, avec un autoresizingMask. Mais j'ai encore du mal avec le redimensionnement de la couche. À l'aide de la UIView, il est totalement ignoré, et à l'aide de la CABasicAnimation, il ne fait rien.
OriginalL'auteur tadejsv
Donc, la solution a été d'animer l' @"limites" et le @de la"position" de la couche, parce que l'image n'est pas animables sur iPhone. Il m'a fallu un certain temps pour comprendre que la position était le centre de la couche et la redimensionner des limites s'étend à partir du centre, mais c'était la partie facile.
Donc, ce que j'ai fait dans le curriculum vitae a été:
Je n'ai pas pu utiliser le UIView système d'animation directement, car elle n'était pas de faire ce que je voulais sur les couches.
Grâce tadej5553 pour m'indiquer la couche problème que j'ai eu avec le "addAnimation". Donc voici le code pour ceux qui voudraient voir à quoi il ressemble.
OriginalL'auteur Sauleil