16

中心を中心に回転させようとしているUIViewので、単純なコードは(擬似コードで)次のようになります。

[UIView beginAnimations:@"crazyRotate" context:nil];
[UIView setAnimationDuration:1.0];
someview.transform = CGAffineTransformMakeRotation(angle);
[UIView commitAnimations]

ここで、角度をM_PI / 2と言うように設定すると、物事はうまく回転します。2 * M_PIに設定すると、「何も」実行されません。マトリックスは何もしないものに変換されることは理解できますが(360度回転すると、ある意味で「滞在」を意味します)、5回回転させたいと思います(新聞の回転スケールが効果を発揮すると考えてください。私はそうではありません)説明が得意です。誰かが理解してくれることを願っています)。そこで、設定角度を180度(M_PI)に追加して、ネストしたを追加してみましたanimatationBlocksomeview.transitionしかし、同じプロパティ( )を再度設定しているので、どういうわけかそれを無視していると思います)。アニメーションの繰り返し回数を角度M_PIで2に設定してみましたが、180度回転し、まっすぐな位置に戻ってから、もう一度回転を開始しているようです。

だから、私は少しアイデアがありません、どんな助けもありがたいです!--t

4

4 に答える 4

36

UIView のレイヤー プロパティで次のアニメーションを使用できます。私はそれをテストしました。

Objective-C

UIView *viewToSpin = ...;    
CABasicAnimation* spinAnimation = [CABasicAnimation
                                  animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI];
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"];

スイフト5.0

let viewToSpin = UIView() // However you have initialized your view
let spinAnimation = CABasicAnimation.init(keyPath: "transform.rotation")
spinAnimation.toValue = NSNumber(value: 5.0 * 2.0 * Float.pi)
viewToSpin.layer.add(spinAnimation, forKey: "spinAnimation")
于 2009-02-06T00:26:09.710 に答える
6

Brad Larson が示したように、これはCAKeyframeAnimation. 例えば、

CAKeyframeAnimation *rotationAnimation;
rotationAnimation = 
   [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

rotationAnimation.values = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0 * M_PI], 
                            [NSNumber numberWithFloat:0.75 * M_PI], 
                            [NSNumber numberWithFloat:1.5 * M_PI], 
                            [NSNumber numberWithFloat:2.0 * M_PI], nil]; 
rotationAnimation.calculationMode = kCAAnimationPaced;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
rotationAnimation.timingFunction = 
   [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
rotationAnimation.duration = 10.0;

CALayer *layer = [viewToSpin layer];
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

プロパティを使用してアニメーション全体の長さを制御し、rotationAnimation.durationプロパティを使用して加速と減速 (およびその間のステップの計算) を制御できrotationAnimation.timingFunctionます。

于 2012-02-28T23:37:19.447 に答える
1
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 8.0f;
animation.repeatCount = INFINITY;
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"];
于 2015-06-22T15:35:04.643 に答える
1

連続回転効果を得るには少し注意が必要ですが、ここでそれを行う手段について説明します。はい、コア アニメーションは、ユニット サークル内の最も近い終了位置への変換を最適化するようです。ここで説明する方法では、いくつかの半回転アニメーションを連鎖させて完全な回転を作成しますが、あるアニメーションから次のアニメーションへのハンドオフがわずかに途切れることに気付きます。

おそらく、これらの半回転値で構築された CAKeyframeAnimation が正しい方法です。さらに、加速と減速を制御することもできます。

于 2009-02-06T13:50:59.027 に答える