11

それは本当に単純なものでなければなりませんが、ブロックを使用してこれを機能させることに成功していません。これには質問と回答がありますが、私が見つけたものはすべて、私が求めているブロックベースのアニメーションではCABasicAnimationなく、使用することによって解決されます。UIView

次のコードは動作しません (ブロックベース)、アニメーションはありません:

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

私の理解では、Block-Based を使用するたびに、UIViewAnimationBlock が開始値が最終値と同じであることを「認識」すると、アニメーションは発生しません。360 度に移動するように設定すると、オブジェクトはその場所にとどまります。ただし、ブロックベース アニメーションを使用してこのアニメーションを作成する必要がありますCABasicAnimation

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"];  

さらに、次のブロックベースは機能しますが、アニメーションの間に停止があります (最初に 180 度回転し、そこから別の 180 度を作成して回転を完了します)。これは私が求めているものではありません。

[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)
                                      {

                                      }];

                 }];

私は多くの時間を節約し、使用に身を委ねてそれをやり遂げることができることを知っていますが、この場合(360度の回転を行う)、一方が機能し、もう一方が機能しない理由CABasicAnimation知りたいです。この場合の 2 と、完全な 360 度回転を実行できるコード (ブロックベース) の間で、これに関する詳細な説明をいただければ幸いです。

前もって感謝します。

4

4 に答える 4

14

これは、iOS 7 のキーフレーム アニメーションが適していることです。たとえば、 の 1 回転viewを 3 つの部分に分割できます。

CGFloat direction = 1.0f;  // -1.0f to rotate other way
view.transform = CGAffineTransformIdentity;
[UIView animateKeyframesWithDuration:1.0 delay:0.0
                               options:UIViewKeyframeAnimationOptionCalculationModePaced | UIViewAnimationOptionCurveEaseInOut
                            animations:^{
                              [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.0 animations:^{
                                view.transform = CGAffineTransformMakeRotation(M_PI * 2.0f / 3.0f * direction);
                              }];
                              [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.0 animations:^{
                                view.transform = CGAffineTransformMakeRotation(M_PI * 4.0f / 3.0f * direction);
                              }];
                              [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.0 animations:^{
                                view.transform = CGAffineTransformIdentity;
                              }];
                            }
                            completion:^(BOOL finished) {}];

UIViewKeyframeAnimationOptionCalculationModePaced使用するときは、すべての開始時間と期間を空白のままにしておくことができることに注意してください。

于 2014-07-16T13:07:57.000 に答える