2010-12-07 6 views
5

UIViewを同時に動かして回転させるアニメーションを作成したいと思います。アニメーションの移動と回転UIViewはうまくいきません

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

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

[UIView commitAnimations]; 

結果は、アニメーションが終了した後の図が正しく描画されること(一部はもう見えない):私は、次のコードを試してみました。フレームまたはアニメーションの変換のみを変更すると、ビューが正しく描画されます。この問題はフレームと変換の両方を設定した場合にのみ発生します。

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

+0

「newFrame」はどこに定義されていますか? –

+0

「beginAnimations」行の直前で定義されています。CGRect newFrame = CGRectMake(30,30,200,200); – kiteloop

答えて

8

回転などのアニメーションも行う場合は、フレーム、境界、または中央を使用することはできません。あなたはすべてのために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]; 
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]; 

中心点の位置は、あなたはもちろん、ビューの移動をしたいポイントになり(左移動とちょうど例えば、回転します)。

0

問題はおそらく、元のフレームサイズと比較して、新しいフレームサイズである可能性があります。フレームを回転させると、フレームの表示が少し複雑になります。 フレームがスーパービューの座標系にあります。したがって、矩形を回転すると、新しいフレームは、ビューを含むスーパービューの座標系で最小の矩形になります。例: フレームサイズが(100 * 100)の正方形のビューを45度回転すると、新しいフレームのサイズは(141 * 141)になり、フレームを(100 * 100)サイズに設定すると、あなたはあなたの意見の一部を切り捨てます。 ビューフレームの仕組みをよりよく理解するためにhereを見てください。

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

このメソッドを使用しますが、ナビゲーションを使用していて1つのビューから別のものに移動すると、その後、あなたのビューは、このメソッドを残す同じplace.elseになり場合:

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

希望これはです助けます。私は同じ問題を抱えていましたが、いくつかの実験を行い、この解決策に来ました。それがあなたを助けたら、私を投票することを忘れないでください。

関連する問題