2014-04-17 15 views
5

Sto provando a fare un giro 360 di una vista ma con un'inclinazione di 45 gradi.Rotazione animata di iOS ad angolo

Ti piace questa

enter image description here

io non riesco a capire per farlo.

Finora ho gestito questa

CABasicAnimation* animation = [CABasicAnimation 
           animationWithKeyPath:@"transform.rotation.y"]; 
animation.fromValue = @(0); 
animation.toValue = @(2 * M_PI); 
animation.duration = 1; 

[self.layer addAnimation:animation forKey:@"rotation"]; 

che ruota sul suo asse y, ma quello che voglio è per questo asse Y per essere inclinato di 45 gradi prima di essere filata.

risposta

1

Innanzitutto, dovresti vedere il link sottostante che spiega le differenze tra "frame" e "bounds". UIView frame, bounds and center

E ora, ecco la mia risposta.

/* add the 4 lines below */ 
self.transform = CGAffineTransformMakeRotation(M_PI_4); 
self.layer.bounds = CGRectMake(0.0f, 0.0f, 60.0f, 200.0f); 
self.layer.position = CGPointMake(150.0f, 300.0f); 

CABasicAnimation* animation = [CABasicAnimation 
           animationWithKeyPath:@"transform.rotation.y"]; 
animation.fromValue = @(0); 
animation.toValue = @(2 * M_PI); 
animation.duration = 1; 

[self.layer addAnimation:animation forKey:@"rotation"]; 
0

1- Cambiare il punto di ancoraggio al bordo superiore destro

self.someView.layer.anchorPoint = CGPointMake(1.0, 0.5); 

2- ruotare la vista di 45 o 35 gradi

CGFloat radians = (M_PI/180) * (-35); 
self.someView.transform = CGAffineTransformRotate(self.someView.transform, radians); 

3- ruotare o capovolgere l'immagine da asse X

CGFloat radians = (M_PI/180) * (180); 
[UIView animateWithDuration:1 animations:^{ 
     self.someView.layer.transform = CATransform3DRotate(self.someView.layer.transform,radians , 1, 0.0, 0.0); 

    } completion:^(BOOL finished) { 
     if(finished) { 
     } 
    }]; 

funziona come un fascino :)

0

provare questo;

CABasicAnimation* animation = [CABasicAnimation 
          animationWithKeyPath:@"transform"]; 

CATransform3D rtfm = CATransform3DMakeRotation(2 * M_PI , 1.0f, 1.0f, 0.0f); 
rtfm.m34 = -0.0015f; 

animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
animation.toValue = [NSValue valueWithCATransform3D:rtfm]; 
animation.duration = 1; 

[self.layer addAnimation:animation forKey:@"rotation"]; 
0

Ecco un esempio Xamarin iOS io uso per sbattere all'angolo di un pulsante quadrato, come un orecchio del cane (facilmente portato su Obj-C):

enter image description here

Metodo 1: utilizzare un'animazione rotazione con 1 per entrambi gli assi x e y (esempi Xamarin.iOS, ma facilmente portabile obj-c):

AnimateNotify(0.10, 0, UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.BeginFromCurrentState,() => 
{ 
    // note the final 3 params indicate "rotate around x&y axes, but not z" 
    var transf = CATransform3D.MakeRotation(-1 * (nfloat)Math.PI/4, 1, 1, 0); 
    transf.m34 = 1.0f/-500; 
    Layer.Transform = transf; 
}, null); 

Metodo 2: sufficiente aggiungere una rotazione x-axis e y-axis rotazione ad una CAAnimationGroup modo da funzionare allo stesso tempo:

AnimateNotify(1.0, 0, UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.BeginFromCurrentState,() => 
{ 
    nfloat angleTo = -1 * (nfloat)Math.PI/4; 
    nfloat angleFrom = 0.0f ; 
    string animKey = "rotate"; 

    // y-axis rotation 
    var anim = new CABasicAnimation(); 
    anim.KeyPath = "transform.rotation.y"; 
    anim.AutoReverses = false; 
    anim.Duration = 0.1f; 
    anim.From = new NSNumber(angleFrom); 
    anim.To = new NSNumber(angleTo); 

    // x-axis rotation 
    var animX = new CABasicAnimation(); 
    animX.KeyPath = "transform.rotation.x"; 
    animX.AutoReverses = false; 
    animX.Duration = 0.1f; 
    animX.From = new NSNumber(angleFrom); 
    animX.To = new NSNumber(angleTo); 

    // add both rotations to a group, to run simultaneously 
    var animGroup = new CAAnimationGroup(); 
    animGroup.Duration = 0.1f; 
    animGroup.AutoReverses = false; 
    animGroup.Animations = new CAAnimation[] {anim, animX}; 
    Layer.AddAnimation(animGroup, animKey); 

    // add perspective 
    var transf = CATransform3D.Identity; 
    transf.m34 = 1.0f/500; 
    Layer.Transform = transf; 

}, null);