2010-11-30 23 views
1

CAAffineTransformationMakeRotationに問題があります。 M ViewDidLoadで22.5度のUIViewを回転しようとしていて、1秒後にビューが画面に飛びます。CAAffineTransformationMakeRotationの問題

コードは次のとおりです。

-(void)ViewDidiLoad{ 

imgView1 = [[UIView alloc] initWithFrame:CGRectMake(20,150,.1,400)]; 
    [imgView1 setBackgroundColor:[UIColor blackColor]]; 
[self.view addSubview:imgView1]; 
CGAffineTransform trans = CGAffineTransformMakeRotation(3.14159/8); 
imgView1.transform = trans; 

[self performSelector:@selector(img1_enter) withObject:nil afterDelay:1]; 
} 


-(void)img1_enter{ 
CGRect frame = [imgView1 frame]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:2.99]; 
frame.origin.x = 550; 
[UIView commitAnimations]; 


[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:2.99]; 
[imgView1 setFrame :frame]; 
[UIView commitAnimations]; 
} 

問題は、このビューフライin..itsは、幅と高さが変化したときにということです。 Viewを回転させずに(AffineTransformationなしで)試してみましたが、正しく動作します。

ビューを回転する他の方法はありますか?

答えて

1

あなたは組み込むことができ、すでにそれぞれのアスペクト比を現在のサイズを維持するために変換既存:

imgView1.transform = CGAffineTransformConcat(trans, imgView1.transform); 

また、UIViewクラスのドキュメント変換恒等変換でない場合は、フレームのプロパティが定義されていないと言います、ローテーションを適用した後は使用しないでください。

+0

これはうまくいきません... – Hisenberg

+0

CGAffineTransformationを使用すると、フレームの代わりに境界線を使用する必要があります。 使用方法を教えてください。 – Hisenberg

+0

申し訳ありませんが、私は何が起こっているのかを間違って理解していました。私はちょうど境界/フレーム/ transormation - ものが実際に動作する方法を明確にすべき新しい答えを投稿しました。たくさん私の疑問を明確にするための –

0

フレーム長方形は、スーパービューの座標系内のビューの位置とサイズを表します。境界矩形はビューの内部座標系を表しているため、境界矩形はビューの実際のピクセル量(それぞれの列と行の量)を処理するソートです。

contentModeをに設定してフレーム矩形を変更すると、境界矩形のサイズがフレーム矩形のサイズに適合するように自動的に調整されます。そうでない場合は境界矩形手つかずのままです。レンダリングのために、フレーム矩形と境界矩形との間の差は、自動的に作成された変換行列によって補償される。

ビューのtransform-propertyが恒等行列の場合にのみ、最後の2つの文が真になります。そうでない場合は、frame-propertyは無効で、ビューの座標系からそのスーパービューの座標系への適切な変換を行うのはあなただけです。したがって、回転を適用する場合は、適切な平行移動とスケーリングを適用して、スーパービューの座標を基準にして表示を取得する必要があります。

だからあなたの場合には、あなたがCGRectMake(-width/2, -height/2, width, height)に境界矩形を設定し、その

xとyはそのの座標系内のビューの中心座標である
CGAffineTransformConcat(
    CGAffineTransformMakeRotation(angle), 
    CGAffineTransformMakeTranslation(x, y) 
) 

、に変換を設定することができますスーパービュー。

+0

おかげで.... は、実際にあなたの最初の答えは私のwork..iは...少し私のアプローチを変更して、あなたのコードを使用し、それが働いた:) そうメートル適切な答えとしてそれをマークします.. :) ありがとうもう一度.. .. :) – Hisenberg