2012-05-13 78 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,也可能是高度。是的,它是可見的變化,因爲圖像越來越小,然後在旋轉之前,用相同的ImageView給定大小。 – User1234

回答

15

好的我答應我會考慮它,所以這裏是我的答案:

我創建了一個場景e這應該與您的代碼相當,代碼如下:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width/2-100, 
                     self.view.bounds.size.height/2-125, 
                     200, 
                     250)]; 

imageView.image = [UIImage imageNamed:@"testimage.jpg"]; 
imageView.contentMode = UIViewContentModeScaleAspectFill; 

/* 
* I added clipsToBounds, because my test image didn't have a size of 200x250px 
*/ 
imageView.clipsToBounds = YES; 

[self.view addSubview:imageView]; 

NSLog(@"frame: %@",[NSValue valueWithCGRect:imageView.frame]); 
NSLog(@"bounds: %@",[NSValue valueWithCGRect:imageView.bounds]);  

imageView.layer.anchorPoint = CGPointMake(0.5, 0.5); 
imageView.transform = CGAffineTransformMakeRotation(30*M_PI/180); 

NSLog(@"frame after rotation: %@",[NSValue valueWithCGRect:imageView.frame]); 
NSLog(@"bounds after rotation: %@",[NSValue valueWithCGRect:imageView.bounds]); 

此代碼假定您使用的是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

他們已經看起來很相似的,對不對?我畫出了實際的框架,以明確界限和框架之間的區別。下一個真的很清楚。我疊加了所有圖像,旋轉UIImageView的旋轉角度,得到如下結果: UIImageViews overlayed to show that size doesn't change

因此,您會發現如何旋轉圖像非常簡單。現在到你的問題,你實際上希望框架保持不變。如果您希望最終幀具有原始幀的大小(在此示例中,寬度爲200,高度爲250),那麼您將不得不縮放最終幀。但是,這當然會導致圖像的縮放,這是你不想要的。我實際上認爲一個更大的框架對你來說不會是一個問題 - 你只需要知道你必須考慮到因爲旋轉而引起的問題。

簡而言之:它不可能有一個UIImageView,它將在旋轉後具有相同的幀。這對任何UIView都是不可能的。想想一個矩形。如果旋轉它,它將不會是旋轉後的矩形,是不是?

當然,你可以把你的UIImageView放在另一個UIView中,它將有一個非旋轉的框架,寬度爲200,高度爲250,但這只是膚淺的,因爲它不會真的改變這個事實:旋轉的矩形與原始的寬度和高度不同。

我希望這會有所幫助。 :)

+0

這裏有一個'NSStringFromCGRect()'函數,它比'NSValue valueWithCGRect:imageView.bounds]'' –

+0

'更容易包裝'NSValue'。感謝您指出這一點,需要寫下來! –

+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

感謝您的回答,但我仍然感到困惑。我只是想用給定的角度手動旋轉ImageView。並且想要保持寬高比,所以圖像看起來是正確的。更清晰 - 我希望圖像看起來像ROTATING之前的圖像,具有給定的邊界。所以旋轉不會改變它的高度/密度。這可能嗎? – User1234

+0

你可以做的是旋轉圖像,然後將其縮放到原始碼 –

相關問題