2014-04-17 6 views
5

Ich versuche, eine 360-Drehung einer Ansicht, aber bei einer Neigung von 45 Grad zu tun.iOS Animate Rotation in einem Winkel

Gefällt Ihnen dieses

enter image description here

kann ich nicht, es zu tun, herauszufinden.

Bisher habe ich es geschafft, diese

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

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

Was es auf, es ist y-Achse dreht, aber was ich will, ist für diese Y-Achse auf 45 Grad gekippt werden, bevor sie gesponnen wird.

Antwort

1

Zunächst sollten Sie den folgenden Link sehen, der die Unterschiede zwischen "frame" und "bounds" erklärt. UIView frame, bounds and center

Und jetzt, hier ist meine Antwort.

/* 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- Ändern der Ankerpunkt an der oberen rechten Kante

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

2- Ansicht drehen, um 45 oder 35 Grad

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

3- Drehen oder kippen die Ansicht von der X-Achse

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) { 
     } 
    }]; 

wirkt wie ein Zauber :)

0

versuchen Sie dies;

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

Hier ist ein Xamarin IOS Beispiel I verwenden, um die Ecke eines Quadrats Taste flattern, wie ein Hund Ohr (leicht portiert obj-c):

enter image description here

Methode 1: verwenden, um eine Rotation Animation mit 1 für beide x und y Achsen (Beispiele in Xamarin.iOS, aber leicht tragbar 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); 

Methode 2: gerade eine x-axis Rotation hinzufügen und y-axis Rotation zu einem CAAnimationGroup, so dass sie zur gleichen Zeit ausgeführt werden:

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);