iOS: eine Komplette 360-Grad-Rotation Using-Block, Nicht CABasicAnimation
Sollte es etwas sein, was wirklich einfach, aber ich habe nicht erfolgreich gewesen bekommen Sie diese, um die Arbeit mit Blöcken. Es gibt Fragen und Antworten zu diesem, aber alle die ich gefunden sind gelöst durch die Verwendung von CABasicAnimation
und nicht durch UIView
Block-Basierte Animation, die ist, was ich bin nach.
Folgender code funktioniert nicht (Block-Basiert), keine animation:
CGAffineTransform spin = CGAffineTransformRotate(spiningView.transform, DEGREES_RADIANS(360));
CATransform3D identity = CATransform3DIdentity;
CATransform3D spin2 = CATransform3DRotate(identity, DEGREES_RADIANS(360), 0.0f, 0.0f, 1.0f);
[UIView animateWithDuration:3.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^
{
spiningView.transform = spin;
//spiningView.layer.transform = spin2;
//Have also tried the above, doesn't work either.
}
completion:^(BOOL finished)
{
spiningView.transform = spin;
//spiningView.layer.transform = spin2;
}];
Von meinem Verständnis, wenn wir jedes mal verwenden Sie Block-Basiert, keine animation auftreten würde, wenn UIViewAnimation
Block "sieht", dass der begin-Wert ist der gleiche wie der Letzte Wert. Fair genug, indem ich Sie zu bewegen, um 360 Grad würde bedeuten, dass das Objekt bleibt wo es ist. Aber es ist ein Weg, um Block-Basierte Animation zu machen, diese animieren, da die folgenden CABasicAnimation
würde einwandfrei funktionieren:
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0f];
rotationAnimation.duration = 3.0f;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 1;
[spiningView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
Darüber Hinaus die folgenden Block-Basiert arbeitet, aber es ist ein Zwischenstopp mit Animationen (erste dreht es um 180 Grad, dann davon, um eine weitere 180-Grad-komplette Drehung), das ist nicht das, was ich nach:
[UIView animateWithDuration:3.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^
{
spiningView.transform = CGAffineTransformRotate(spiningView.transform, DEGREES_RADIANS(180));;
}
completion:^(BOOL finished)
{
[UIView animateWithDuration:3.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^
{
spiningView.transform = CGAffineTransformRotate(spiningView.transform, DEGREES_RADIANS(360));
}
completion:^(BOOL finished)
{
}];
}];
Ich weiß, ich könnte viel Zeit sparen, und einfach aufgeben, mich mit CABasicAnimation
und mit ihm getan werden, aber ich möchte wissen, warum das eine funktioniert und der andere nicht in diesem Fall (einer 360-Grad-Drehung). Ich hoffe, dass du mir eine ausführliche Erklärung für diese zwischen den 2 in diesem Fall und einigen code (Block-Basiert), können führen Sie eine komplette 360-Grad-Drehung.
Vielen Dank im Voraus.
- Sollte nicht die zweite Transformation (in die block-basierte Lösung) verwenden, 180 Grad, da es sich um eine transformation über den aktuellen transform-Eigenschaft an diesem Punkt (das ist schon 180 Grad)? Auch haben Sie versucht, nur mit
CGAffineTransformMakeRotation(M_PI*2)
im Einzelzimmeranimations
block? - In der zweiten animation block in den zweiten block-basierte Lösung ist in der Tat 360 Grad, wenn ich 180 Grad, es würde sich nur drehen um 180 Grad (von der ersten animation-block) und Stoppt dort. Auch scheint es mir seltsam, dass ich eingestellt habe 360 Grad in der zweiten nested-block-statt 180.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit UIView-Animationen, Core Animation berechnet den kürzesten Pfad zwischen der ersten Transformation und der endgültigen Transformation. Die 360° - Drehung funktioniert nicht, da die Letzte Transformation ist die gleiche wie die erste zu verwandeln.
Für was es Wert ist, ich habe einfach versucht den folgenden code, das macht vier 90° - Drehungen glatt, ohne Verzögerung zwischen den Rotationen:
view.transform
.CABasicAnimation
ist eine explizite animation, nicht implizit, wie Sie sagte.CATransaction
. Der zweite block kann nicht die Berechnung der key-frames, bis der erste block abgeschlossen ist, daher die Verzögerung. Ich vermute, dass mein rekursive, einzelne transformation Ansatz ist optimiert in einem einzigenCATransaction
.Dies ist etwas, was iOS 7 keyframe-Animationen sind gut geeignet. Zum Beispiel, können Sie split eine vollständige Drehung des
view
sich in drei Teile:Beachten Sie, dass bei der Verwendung von
UIViewKeyframeAnimationOptionCalculationModePaced
können Sie verlassen alle Startzeiten und dauern leer.Hier ist eine ausführlichere version von neilco ist rotateSpinningView.
Dreht es sich im Uhrzeigersinn oder gegen den Uhrzeigersinn. Es hat eine
completion:
parameter und es startet und Stoppt einfach.@neilco legte eine sehr gute Lösung aber es ist eine unendliche rotation.
Basierend auf seinen code, die ich ändern ein bisschen zu implementieren, die eine eine Schleife rotation.
}