2

animateWithDuration を使用して、UIVIew の 1 つを際限なく回転させています。ここで、特定の時間における UIView の回転の現在の値を取得する必要があります。次の関数を使用しようとしました:

-(float)getCurrentRotation{
CGAffineTransform transform = ((UIImageView*)[self.subviews objectAtIndex:0]).transform;
return (atan2(transform.b, transform.a));
}

ただし、 animateWithDuration への最初の呼び出しで指定した値と同じ値 (M_PI/2) を常に返します。

[UIView animateWithDuration:4 delay:0 options:( UIViewAnimationOptionRepeat|UIViewAnimationOptionCurveLinear) animations:^{
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI/2);
    ((UIImageView*)[self.subviews objectAtIndex:0]).transform = transform;
}
                 completion:^(BOOL finished){
                 }];

回転の現在の値を取得する方法はありますか?

ありがとう。

4

2 に答える 2

2

CoreAnimation ベースのアニメーションを使用する場合、ビュー プロパティ (境界、変換など) は実際には変更されません。アニメート中に画面に表示されるレイヤーのプロパティの変更 (このドキュメンテーション ページを参照) は、 を使用してアクセスできますview.layer.presentationLayer

したがって、次の行は、要求した時点で実際の変換を取得します。

CGAffineTransform transform = CATransform3DGetAffineTransform([(CALayer*)[[[self.subviews objectAtIndex:0] layer] presentationLayer] transform]);

QuartzCoreこれが機能するには、 を定義するフレームワークにリンクして含める必要がありますCALayer

#import <QuartzCore/QuartzCore.h>
于 2012-08-24T14:16:48.413 に答える
0

画面に表示されているときに「回転の値」を見ることができるかどうかはわかりません。しかし、そうではないと思います。なぜなら、ビュー オブジェクトにはすぐに新しいプロパティ値があり、到達できないオブジェクトのフレームワークの奥深くでアニメーションが行われるからです。

あなたの目標を達成するために、ローテーションをニーズに十分な粒度で単一のステップに分けます。次に、歩数を数えて、現在の歩数を利用できるようにします。次のようになります (テストされていません。ただの落書きです)。

//step and rotator declared as class members
//rotator is the one which is referred to as ((UIImageView*)[self.subviews objectAtIndex:0]) in the original question 
-(CGFloat)currentRotation

{
  return step*(M_PI/16);
}

-(void)turnturnturn
{
  [UIView animateWithDuration:0.2 
                   animations:^
                   {
                     rotator.transform = CGAffineTransformConcat(CGAffineTransformMakeRotation(M_PI/16), rotator.transform);
                     step++;
                   } 
                   completion:^(BOOL finished) 
                   {
                     if(step == 32)
                     {
                        step = 0;
                        rotator.transform = CGAffineTransformIdentity;
                     }
                     [self turnturnturn];
                   }];
}
于 2012-08-24T10:59:52.970 に答える