2010-10-21 20 views
4

Voici une suite à une question précédente. Mon code ci-dessous anime un carré en l'agrandissant et en le faisant pivoter. Il le fait en faisant une rotation et en lui ajoutant une transformation d'échelle. Cela fonctionne bien. Quand c'est fait, il appelle throbReset. J'avais l'habitude d'avoir throbReset juste mis self's transform à un CGAffineTransformMakeScale et cela le déplierait, mais le relèverait aussi. J'ai donc essayé de commencer par le transform actuel et d'y ajouter l'unscale, mais maintenant il ne fait plus rien (visible).Impossible d'annuler une transformation d'échelle sans annuler une transformation de rotation


CGColorRef color = [[colorArray objectAtIndex:colorIndex] CGColor]; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:0.5f]; 
[UIView setAnimationDidStopSelector:@selector(throbReset:context:)]; 
// [[self layer] setFillMode:kCAFillModeForwards]; // apparently not needed 
CGAffineTransform xForm = CGAffineTransformMakeScale(2.0, 2.0); 
xForm = CGAffineTransformRotate(xForm, M_PI/4); 
[self setTransform:xForm]; 
[[self layer] setBackgroundColor:color]; 
[UIView commitAnimations]; 
} 

- (void)throbReset:(NSString *)animationID context:(void*)context { 
NSLog(@"-%@:%s fired", [self class], _cmd); 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:2.0]; 
CGAffineTransform xForm = [self transform]; 
xForm = CGAffineTransformScale(xForm, 1.0, 1.0); 
[self setTransform:xForm]; 
[UIView commitAnimations]; 
} 

Répondre

2

Vous mise à l'échelle juste pour la même taille, puisque vous dites essentiellement prendre le courant et redimensionnez transform 1: 1 sur X et 1: 1 sur Y. Vous pouvez faire 0.5,0.5 au lieu de 1.0.1.0 dans votre seconde méthode. Lorsque vous ajoutez la rotation dans l'ordre inverse, gardez à l'esprit lorsque vous ajoutez la rotation dans l'ordre inverse, faites donc pivoter puis mettez à l'échelle. Ce serait plus important si vous impliquiez une traduction, mais dans ce cas, cela fonctionnerait probablement dans les deux cas.

+0

Donc, si je venais de définir ma propriété 'transform' sur' CGAffineTransformMakeScale (1.0, 1.0) 'ne serait-il pas revenu à la taille d'origine? Je ne comprends pas vraiment la différence entre 'CGAffineTransformMakeScale' et' CGAffineTransformScale'. Je veux dire que je comprends ce que sont les arguments, mais pas la fonctionnalité sous-jacente. – Steve

+0

Vous opérez relativement sur la transformation que vous spécifiez dans l'appel de fonction CGAffine, donc TransformScale met à l'échelle l'entrée par rapport à elle-même. Dans ce cas, vous entrez la transformation en cours, qui est mise à l'échelle 1: 1. Je ne suis pas sûr sur la différence MakeScale, peut-être qu'il suppose la transformation d'identité comme la transformation d'entrée. – Ben