2010-12-07 4 views
5

Je veux créer une animation qui déplace et fait pivoter un UIView en même temps. J'ai essayé le code suivant:Le déplacement animé et la rotation d'un UIView ne fonctionnent pas tout à fait

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

myView.frame = newFrame; 
myView.transform = CGAffineTransformMakeRotation(0.4); 

[UIView commitAnimations]; 

Le résultat est que, après l'animation a terminé la vue est tiré de manière incorrecte (certaines parties ne sont plus visibles). Si je change seulement le cadre OU la transformation pour l'animation, la vue dessine correctement. Le problème se produit uniquement si je définis le cadre et la transformation.

Quelle serait la bonne façon d'animer le déplacement et la rotation d'une vue en même temps?

+0

Où 'newFrame' est-il défini? –

+0

Il est défini juste avant la ligne "beginAnimations": CGRect newFrame = CGRectMake (30,30,200,200); – kiteloop

Répondre

8

Vous ne pouvez pas utiliser le cadre, les limites ou le centre si vous animez également des éléments tels que la rotation. Vous devez utiliser CGAffineTransforms pour tout et les concaténer ensemble. Comme ceci:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100,100); 
transform = CGAffineTransformRotate(transform, 0.4); 

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

myView.transform = transform; 

[UIView commitAnimations]; 
4

Essayez de le faire de cette façon: (mouvement vers la gauche et la rotation, juste par exemple)

[UIView beginAnimations:@"MoveAndRotateAnimation" context:NULL]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration]; 

CGPoint center   = CGPointMake(-200, self.view.center.y); 
self.view.transform = CGAffineTransformMakeRotation(-0.5); 
self.view.center  = center; 

[UIView commitAnimations]; 

Les emplacements des points centraux seraient le point que vous souhaitez faire bouger la vue, bien sûr.

0

Le problème est probablement lié à la taille de votre nouvelle image par rapport à la taille d'image d'origine. Le cadre de vue est un peu délicat lorsque vous faites pivoter un cadre: Le cadre est dans le système de coordonnées superviews. Ainsi, lorsque vous faites pivoter un rectangle, le nouveau cadre sera le plus petit rectangle du système de coordonnées de superview qui contient la vue. par exemple. Si vous avez une vue carrée avec une taille d'image de (100 * 100) et que vous la faites pivoter de 45 degrés, votre nouvelle image aura une taille de (141 * 141) et si vous avez défini une taille de (100 * 100) vous allez couper une partie de votre vue. Regardez here pour mieux comprendre le fonctionnement de la vue.

0

que vous devez faire de cette façon ...

#pragma mark (Woblling animation) 
    CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-10.0)); 
    CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(10.0)); 

    self.view .transform = leftWobble; // starting point 
    [UIView beginAnimations:@"wobble" context:self.view ]; 
    [UIView setAnimationRepeatAutoreverses:YES]; // important 
    [UIView setAnimationRepeatCount:11]; 
    [UIView setAnimationDuration:1.00]; 
    //[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];//should be same as written 
    self.view .transform = rightWobble; // end here & auto-reverse 
    [UIView commitAnimations]; 

puis mettre en œuvre ces méthodes ... ils sont nécessaires pour garder votre point de vue dans la même position après la rotation.

- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    if ([finished boolValue]) { 
     UIView* item = (UIView *)context; 
     item.transform = CGAffineTransformIdentity; 
    } 
} 

Utilisez cette méthode si vous utilisez la navigation et lorsque vous naviguez d'une vue à l'autre, votre point de vue serait en même place.else laisser cette méthode:

- (void)viewWillAppear:(BOOL)animated 
{ 
    UIView* item = self.view; 
    item.transform = CGAffineTransformIdentity; 
} 

Hope this serait T'aider. J'ai eu le même problème mais fait quelques expériences et suis venu à cette solution. Si ça t'aide alors n'oublie pas de me voter.

Questions connexes