2012-05-13 15 views
6

私は変換を使用することで新しいです。そして、彼らがどのように働いているのかまだ悩んでいました。UIImageViewの回転後のサイズが変更されるのはなぜですか?

私がやっていることは、与えられた角度で私のUIImageViewを回転させることです。しかし、回転した後、イメージのサイズが小さくなります。 ImageViewのスケーリングも行っていますので、逆さまになりません。 ImageViewが割り当てられたときに、CGRectMakeで与えられたサイズを回転して保持する方法は?

UIImageView *myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(x,y,width,height)];   

    myImageView.contentMode = UIViewContentModeScaleAspectFit; 

    [myImageView setImage:[UIImage imageNamed:@"image.png"]]; 

    myImageView.layer.anchorPoint = CGPointMake(0.5,0.5); 

    CGAffineTransform newTransform; 

    myImageView.transform = CGAffineTransformMakeScale(1,-1);    

    newTransform = CGAffineTransformRotate(newTransform, 30*M_PI/180); 

    [self.window addSubview:myImageView]; 

ありがとうございます!

+0

実際に変更されているのは何ですか?あなたは、UIImageViewのフレームが変わったと話していますか?それとも、画像サイズの目に見える変化ですか?あなたはどのように変化を確認しましたか?ビューを回転すると、そのフレームは常に変化します。これは、フレームがスーパービュー内のビューのスペースを表しているためです。回転したビューの境界は同じままです。 –

+0

touchesBeganにコードがあります: – MCKapur

+0

@JohannesLumpe Imageのweidht、おそらく高さも変わります。はい、それは目に見える変化です。Imageはそのサイズが同じで、回転する前にはるかに小さくなっています。 – User1234

答えて

15

私はそれを調べると約束したので、ここに私の答えです:

私はシーンを作成しますこのコードはあなたとARCを使用していることを前提としています。追加しない場合は、

[imageView release]; 

最後に追加してください。あなたは境界が常に同じまま見ることができるように

[16221:207] frame: NSRect: {{60, 105}, {200, 250}} 
[16221:207] bounds: NSRect: {{0, 0}, {200, 250}} 
[16221:207] frame after rotation: NSRect: {{10.897461, 71.746826}, {298.20508, 316.50635}} 
[16221:207] bounds after rotation: NSRect: {{0, 0}, {200, 250}}  

:ログは次のようになり、このコードを使用して

。実際に回転によって変化するのは、フレームです。なぜなら、30°C回転された画像は、回転していない場合よりももちろん幅が広いからです。また、中心点がビューの実際の中心に設定されているため、フレームの原点も変更されます(左上にプッシュされます)。画像自体のサイズがの場合、は変更されません。スケーリングせずに結果を得ることができるので、私はスケール変換を使用しませんでした。

しかし、ここでそれをより明確にするためにあなたのためにいくつかの写真(0°、30°、90°回転)されている:彼らはすでに、右、かなり似て 0°,30° and 90° rotations of UIImageView

?実際のフレームを描き、境界とフレームの違いを明確にしました。次の1つは本当にそれを明確にします。私は、UIImageViewを回転させたとの負の度にそれらを回転させ、次の結果を与え、すべての画像をオーバーレイ:UIImageViews overlayed to show that size doesn't change

だからあなたが見ることはかなりまっすぐ進むの画像を回転させる方法です。あなたの問題は、実際にフレームを同じにしておきたいということです。最終フレームのサイズを元のフレームのサイズ(この例では幅200、高さ250)にしたい場合は、結果のフレームを拡大縮小する必要があります。しかし、これはもちろんイメージのスケーリングにつながります。あなたは望ましくないイメージです。私は実際には、大きなフレームがあなたにとって問題ではないと考えています。回転のために考慮する必要があることだけを知る必要があります。

要するに、回転後に同じフレームを持つUIImageViewを持つことはできません。これはどのUIViewでも不可能です。ちょうど長方形を考える。あなたがそれを回転させると、それは回転の後に矩形ではありませんか?

もちろん、UIImageViewを幅200と高さ250の回転していないフレームを持つ別のUIViewに配置することはできますが、それは実際には回転矩形の幅と高さは元のものとは異なります。

こちらがお役に立てば幸いです。 :)

+0

'NSStringFromCGRect()'関数は、 'NSValue'のように' NSValue valueWithCGRect:imageView.bounds 'のようにラップするよりも簡単です。 –

+0

それを指摘してくれてありがとう、書き留めておく必要があります! –

+2

これらの便利な[UIKit関数]の負荷があります(http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html) –

0

UIImageViewがUIViewから継承するcontentModeを設定しないで、選択したUIViewContentModeに従ってスケーリング、変換、デバイスローテーションに従ってフレームの変更を行います。また、あなたはちょうどあなたがちょうど使用してフレームに変更することができます回転したい場合は

: -

[UIView beginAnimations:@"Rotate" context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationDelegate:self]; 
    CGRect frame=yourView.frame; 
    frame.origin.y+=distance you want to rotate; 
    yourview.frame=frame; 
    [UIView commitAnimations]; 
} 

あなたはアニメーションだけのフレームに変更したいいけない場合を

これを使用してみてください: -

CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
animation.fromValue = [NSNumber numberWithFloat:0.0f]; 
animation.toValue = [NSNumber numberWithFloat: 2*M_PI]; 
animation.duration = 0.5f;    
animation.repeatCount = HUGE_VALF;  // HUGE_VALF is defined in math.h so import it 
[self.reloadButton.imageView.layer addAnimation:animation forKey:@"rotation"]; 
+0

私はそれを使用しているので、私のイメージはアスペクト比を失わないでしょう。私がそれを取り除くと、それは保持されず、イメージはうまく見えません。 – User1234

+0

答えをありがとうが、私はまだ混乱しています。私はちょうど与えられたangle.Andを持つImageViewを回転させ、縦横比を維持したいので、画像は正しいように見えるでしょう。もっとクリア - 画像が同じサイズに見えるようにしてください。回転しても高さは変わりません。可能でしょうか? – User1234

+0

あなたができることは、画像を回転させてオリジナルに拡大することです –

関連する問題