2012-05-11 6 views
0

私はカスタムUIViewを持っています。これは2つの矩形のUIBezierPathを初期化し、drawRectではこれらの2つのパスを単に埋めます。UIBezierPathsを使用してカスタムUIViewでCGAffineTransformの回転を逆にする

このビューはボタンに配置されています。ボタンをクリックすると、animateWithDurationブロック内で回転が適用されます。

icon.transform = CGAffineTransformMakeRotation(M_PI*-0.25); 

これは素晴らしい動作です。

ボタンをもう一度クリックすると、ビューを元の向きに戻して回転させるようにしています。私は試してみました:

icon.transform = CGAffineTransformInvert(icon.transform); 
icon.transform = CGAffineTransformMakeRotation(M_PI*0.25); 
icon.transform = CGAffineTransformIdentity; 

...など多くの変形がありますが、どれも動作していないようです。代わりに、ビューは見えなくなるまでゆがんでいます。何もまったく伸ばされていません。時には、最初のトランスフォームを再度適用するとそれが戻されますが、それ以外の変換では戻らないことがあります。

私は間違っていますか?

答えて

1

iosでは、変換は常に相対的なので、変換が完了すると、次の変換は前の変換との相対的なものにする必要があります。 2番目のボタンをクリックすると、ビューのフレームを変更して元の状態に戻すことができます。偶数回のクリックでフレームを元に戻す必要があります。次のコードを実装します。新しい標準であるため、ブロックレベルのコードを快適に使用することができます。

int noOfClicks = 0; 

-(IBAction)yourBtnAction:(id)sender 
{ 
    noOfClicks++; 

    if(noOfClicks %2 != 0) 
    { 
     [UIView beginAnimations:@"Rotate" context:nil]; 
     [UIView setAnimationDuration:1.0]; 
     [UIView setAnimationDelegate:self]; 
     CGRect frame=yourView.frame; 
     frame.origin.y+=20; 
     yourview.frame=frame; 
     [UIView commitAnimations]; 
    } 
    else 
    { 
     [UIView beginAnimations:@"Rotate" context:nil]; 
     [UIView setAnimationDuration:1.0]; 
     [UIView setAnimationDelegate:self]; 
     CGRect frame=yourView.frame; 
     frame.origin.y-=20; 
     yourview.frame=frame; 
     [UIView commitAnimations]; 
    } 
} 

あなたが戻すには、以下のが、同じロジックを採用し、使用することができますように多くの変更を行うにしたくない場合は、次の

[UIView beginAnimations:@"Rotate back" context:nil]; 
[UIView setAnimationDuration:1.0]; 

yourView.transform = CGAffineTransformIdentity; 

[UIView commitAnimations]; 
+0

も ​​- これは私が何をしているのか、本質的です。あなたの反応は私に問題を再訪するよう奨励しました。私の問題は、私がローテーションと同時に適用していたフレームへの変更であることが判明しました。回転後、フレームが異なっていたため(回転したUIViewを含むため)、フレームを戻そうとしたときに予期しない結果が生じました。私はスケールを適用し、変換を最初のクリックに変換してから、アイデンティティ変換を使用して2番目の変換でこれらの変更を元に戻しました。ご協力いただきありがとうございます! – elijah

関連する問題