5

UIView の移動と回転を同時に行うアニメーションを作成したいと考えています。次のコードを試しました:

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

myView.frame = newFrame;
myView.transform = CGAffineTransformMakeRotation(0.4);

[UIView commitAnimations];

その結果、アニメーションが終了した後、ビューが正しく描画されません (一部のパーツが表示されなくなります)。アニメーションのフレームまたは変換のみを変更すると、ビューは正しく描画されます。この問題は、フレームと変換の両方を設定した場合にのみ発生します。

ビューの移動と回転を同時にアニメーション化する正しい方法は何ですか?

4

4 に答える 4

9

回転などもアニメーション化している場合は、frame、bounds、または center を使用できません。すべてに CGAffineTransforms を使用し、それらを連結する必要があります。そのようです:

CGAffineTransform transform = CGAffineTransformMakeTranslation(100,100);
transform = CGAffineTransformRotate(transform, 0.4);

[UIView beginAnimations:@"MoveAndRotateAnimation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

myView.transform = transform;

[UIView commitAnimations];
于 2010-12-09T04:44:06.520 に答える
4

このようにしてみてください: (たとえば、左に移動して回転する)

[UIView beginAnimations:@"MoveAndRotateAnimation" context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:kAnimationDuration];

CGPoint center         = CGPointMake(-200, self.view.center.y);
self.view.transform    = CGAffineTransformMakeRotation(-0.5);
self.view.center       = center;

[UIView commitAnimations];  

もちろん、中心点の位置は、ビューを動かしたい点になります。

于 2010-12-07T19:47:04.017 に答える
0

問題は、元のフレーム サイズと比較して、新しいフレーム サイズにある可能性があります。フレームを回転するとき、ビュー フレームは少しトリッキーです: フレームはスーパービュー座標系にあります。したがって、長方形を回転すると、新しいフレームは、ビューを含むスーパービューの座標系で最小の長方形になります。たとえば、フレーム サイズが (100*100) の正方形のビューがあり、それを 45 度回転すると、新しいフレームのサイズは (141*141) になり、フレームのサイズを (100*100) に設定した場合) ビューの一部を切り取ります。ビュー フレームがどのように機能するかをよりよく理解するには、こちらを参照してください。

于 2010-12-08T02:38:52.667 に答える
0

これを行う必要があります:

#pragma mark (Woblling animation)   
    CGAffineTransform leftWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-10.0));
    CGAffineTransform rightWobble = CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(10.0));

    self.view .transform = leftWobble;  // starting point
    [UIView beginAnimations:@"wobble" context:self.view ];
    [UIView setAnimationRepeatAutoreverses:YES]; // important
    [UIView setAnimationRepeatCount:11];
    [UIView setAnimationDuration:1.00];
    //[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(wobbleEnded:finished:context:)];//should be same as written
    self.view .transform = rightWobble; // end here & auto-reverse
    [UIView commitAnimations];

次に、これらのメソッドを実装します。これらは、回転後にビューを同じ位置に保つために必要です。

- (void) wobbleEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{
    if ([finished boolValue]) {
        UIView* item = (UIView *)context;
        item.transform = CGAffineTransformIdentity;
    }
}

ナビゲーションを使用していて、あるビューから別のビューに移動する場合、ビューは同じ場所にある場合はこのメソッドを使用します。それ以外の場合は、このメソッドを終了します。

- (void)viewWillAppear:(BOOL)animated
{
    UIView* item = self.view;
    item.transform = CGAffineTransformIdentity;
}

私は同じ問題を抱えていましたが、いくつかの実験を行い、この解決策を思いつきました。

于 2010-12-08T06:42:22.613 に答える