2012-05-13 2 views
6

Tôi mới sử dụng các phép biến đổi. Và vẫn còn băn khoăn về cách họ đang làm việc.Tại sao sau khi xoay kích thước UIImageView đang thay đổi?

Điều tôi đang cố gắng làm là xoay UIImageView của tôi với góc đã cho. Nhưng sau khi quay, nó thay đổi kích thước của hình ảnh, trở nên nhỏ hơn. Tôi cũng đang làm rộng cho ImageView để nó không bị lộn ngược. Làm thế nào để xoay và giữ kích thước, đã được đưa ra trong CGRectMake, khi ImageView được phân bổ?

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

Cảm ơn rất nhiều!

+0

Điều gì thực sự đang thay đổi? Bạn đang nói về khung của những thay đổi UIImageView? Hoặc nó là một thay đổi có thể nhìn thấy của kích thước hình ảnh? Bạn đã xác nhận thay đổi như thế nào? Nếu bạn xoay một khung nhìn, khung của nó sẽ luôn thay đổi, vì khung đại diện cho không gian của khung nhìn bên trong nó là superview. Các giới hạn của chế độ xem xoay sẽ giữ nguyên. –

+0

là có bất kỳ mã nào trong touchesBegan: – MCKapur

+0

@JohannesLumpe Nó thay đổi weidht của hình ảnh, và có lẽ chiều cao là tốt. Có, đó là thay đổi có thể nhìn thấy, bởi vì hình ảnh là nhận được nhỏ hơn nhiều, sau đó là trước khi quay, với cùng một kích thước cho ImageView. – User1234

Trả lời

15

Ok tôi đã hứa tôi sẽ xem xét nó, vì vậy đây là câu trả lời của tôi:

Tôi tạo ra một cảnh quan e phải tương đương với phần của bạn, mã như sau:

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]); 

Mã này giả định rằng bạn đang sử dụng ARC. Nếu không thêm

[imageView release]; 

ở cuối.

Sử dụng mã này các bản ghi giống như thế này:

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

Như bạn có thể thấy các giới hạn luôn giữ nguyên. Điều gì thực sự thay đổi do xoay là khung, bởi vì một hình ảnh đã được quay bởi 30 ° C là tất nhiên rộng hơn nếu nó không được quay. Và kể từ khi điểm trung tâm đã được thiết lập để trung tâm thực tế của xem, nguồn gốc của khung hình cũng thay đổi (được đẩy sang trái và trên). Lưu ý rằng kích thước của hình ảnh chính nó không thay đổi. Tôi không sử dụng phép biến đổi tỷ lệ, vì kết quả có thể đạt được mà không cần mở rộng quy mô.

Nhưng để làm cho nó rõ ràng hơn đây là một số hình ảnh cho bạn (0 °, 30 ° 90 ° xoay): 0°,30° and 90° rotations of UIImageView

Họ đã trông khá giống nhau, phải không? Tôi đã vẽ các khung hình thực tế để làm rõ sự khác biệt giữa giới hạn và khung là gì. Người tiếp theo thực sự làm cho nó rõ ràng. Tôi đã xếp chồng lên tất cả các hình ảnh, xoay chúng theo các độ âm mà UIImageView được xoay, đưa ra kết quả sau: UIImageViews overlayed to show that size doesn't change

Vì vậy, bạn thấy khá thẳng về cách xoay hình ảnh. Bây giờ cho vấn đề của bạn mà bạn thực sự muốn khung ở lại giống nhau. Nếu bạn muốn khung cuối cùng có kích thước khung ban đầu của bạn (trong ví dụ này với chiều rộng là 200 và chiều cao là 250) thì bạn sẽ phải mở rộng khung kết quả. Nhưng điều này tất nhiên sẽ dẫn đến việc chia tỷ lệ hình ảnh mà bạn không muốn.Tôi thực sự nghĩ rằng một khung lớn hơn sẽ không phải là một vấn đề cho bạn - bạn chỉ cần biết rằng bạn phải đưa nó vào tài khoản vì vòng quay.

Tóm lại: không thể có UIImageView sẽ có cùng một khung hình sau khi xoay. Điều này là không thể cho bất kỳ UIView. Chỉ cần nghĩ về một hình chữ nhật. Nếu bạn xoay nó, nó sẽ không phải là một hình chữ nhật sau khi quay, phải không?

Tất nhiên bạn có thể đặt UIImageView bên trong một UIView khác sẽ có khung không xoay với chiều rộng là 200 và chiều cao là 250 nhưng sẽ chỉ ở bề ngoài, vì nó sẽ không thực sự thay đổi thực tế hình chữ nhật xoay có độ rộng và chiều cao khác so với hình chữ nhật ban đầu.

Tôi hy vọng điều này sẽ hữu ích. :)

+0

Có một hàm 'NSStringFromCGRect()' có thể hơi dễ dàng hơn việc gói những thứ trong 'NSValue' giống như' [Giá trị NSValueWithCGRect: imageView.bounds] ' –

+0

Cảm ơn bạn đã chỉ ra điều đó, cần viết xuống! –

+2

Có toàn bộ tải về các chức năng [UIKit] hữu ích này (http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html) –

0

Không đặt contentMode mà UIImageView kế thừa từ UIView và dẫn đến các thay đổi trong khung theo tỷ lệ, chuyển đổi, xoay thiết bị theo UIViewContentMode bạn chọn.

Ngoài ra nếu bạn chỉ muốn xoay bạn chỉ có thể thay đổi khung sử dụng: -

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

nếu bạn không muốn những hình ảnh động chỉ cần thay đổi khung

Hãy thử dùng này: -

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

Tôi đang sử dụng nó, vì vậy hình ảnh của tôi sẽ không mất tỷ lệ cỡ ảnh. Nếu tôi xóa nó, nó sẽ không giữ nó, và hình ảnh sẽ không đẹp. – User1234

+0

Cảm ơn bạn đã trả lời, nhưng tôi vẫn còn bối rối. Tôi chỉ muốn xoay theo cách thủ công ImageView với góc độ nhất định. Và muốn giữ tỷ lệ khung hình, vì vậy hình ảnh sẽ có vẻ chính xác. Rõ ràng hơn- Tôi muốn hình ảnh có cùng kích thước, trước khi ROTATING, với giới hạn nhất định. Vì vậy, xoay sẽ không thay đổi chiều cao của nó/weidght.Is nó có thể? – User1234

+0

những gì bạn có thể làm là xoay hình ảnh và sau đó mở rộng nó thành –