2010-09-24 30 views
6

Tôi đang phát triển một ứng dụng cho iPad và tôi cố gắng xử lý nhiều hướng. Ứng dụng của tôi chứa chế độ xem web và UIImageView tải xuất hiện khi chế độ xem web của tôi đang tải nội dung.SDK iPad, cách xử lý hướng bằng UIImageView

UIImageView này có hình nền mà tôi đã đặt trong InterfaceBuilder. Khi tôi thay đổi hướng sang phong cảnh, hình ảnh sẽ bị cắt.

Tôi muốn UIImageView đặt image-portrait.png khi ipad ở chế độ dọc và image-landscape.png khi ở chế độ ngang.

Cảm ơn sự giúp đỡ và lời khuyên của bạn!

Ảnh chụp màn hình:

alt text alt text

+0

Chính xác bạn có ý nghĩa gì khi 'cắt'? Một bức ảnh sẽ hữu ích. – colithium

+0

Hình ảnh của tôi là 768x1004 ở chế độ dọc. Ở chế độ ngang, nó vẫn ở độ rộng 768px thay vì 1024px. Tôi sẽ đăng một màn hình. – Salah

+0

Đây là ảnh chụp màn hình theo chiều dọc: http://img202.imageshack.us/img202/9617/screenshot20100924at141.png và phong cảnh: http://img832.imageshack.us/img832/9617/screenshot20100924at141.png – Salah

Trả lời

7

Tôi tìm thấy một giải pháp:

Trong Interface Builder, tôi đặt autosizing của ImageView của tôi để tự động điền vào màn hình. Trong ViewController của tôi, tôi thêm một phương pháp để phát hiện sự thay đổi định hướng và tôi đặt hình ảnh thích hợp phụ thuộc nếu iPad là trong bức chân dung hoặc phong cảnh:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
if((self.interfaceOrientation == UIDeviceOrientationLandscapeLeft) || (self.interfaceOrientation == UIDeviceOrientationLandscapeRight)){ 
    myImageView.image = [UIImage imageNamed:@"image-landscape.png"]; 
} else if((self.interfaceOrientation == UIDeviceOrientationPortrait) || (self.interfaceOrientation == UIDeviceOrientationPortraitUpsideDown)){ 
    myImageView.image = [UIImage imageNamed:@"image-portrait.png"]; 
} } 
+1

Đây là trường hợp tốt để sử dụng 'UIInterfaceOrientationIsLandscape' &&' UIInterfaceOrientationIsPortrait' –

5

Tôi mất một lúc để hiểu khái niệm này. Tôi không muốn tạo cùng một bức ảnh chân dung và phong cảnh. Chìa khóa ở đây là CGAffineTransformMakeRotation quay từ trạng thái ban đầu của UIImageView của bạn hoặc bất kỳ UIView nào cho vấn đề đó. Điều này giả định hình nền của bạn có định hướng cho nó. Ví dụ. Bạn muốn đặt UIImageView của mình, trong khi các đối tượng khác hoạt động theo sự kiện thay đổi định hướng bình thường.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 

    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {   
     backgroundImage.transform = CGAffineTransformMakeRotation(M_PI/2); 
    } 
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight){ 
     backgroundImage.transform = CGAffineTransformMakeRotation(-M_PI/2); 
    } 
    else { 
     backgroundImage.transform = CGAffineTransformMakeRotation(0.0); 
    } 
} 
1

Trong khi Salah câu trả lời của bạn trông ok với tôi tôi tin rằng bạn có thể làm hai cải tiến ở đây:

  1. Đặt hình nền trong chức năng này:

    -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    

    thời gian (Thời gian NSTimeInterval)

    nếu bạn thực hiện thay đổi trong didRotateFromInterfaceOrientation bạn sẽ thay đổi hình nền sau khi bạn đã hoàn thành để xoay IPad và chuyển đổi từ hai hình nền sẽ không được mịn màng: bạn sẽ thấy rõ ràng hình nền mới bật lên ở cuối vòng quay.

  2. Cải thiện thiết lập các giá trị myImageView.image:

    _myImageView.image = UIInterfaceOrientationIsLandscape (interfaceOrientation)? [UIImage imageNamed: @ "image-landscape.png"]: [UIImage imageNamed: @ "image-portrait.png"];

3

Bạn có thể xử lý hướng bằng cách tự động xem.

UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background-image"]]; 

imageView.frame = self.view.bounds; 
imageView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight 
iimageView.contentMode = UIViewContentModeScaleAspectFill; 

[self.view addSubview:imageView]; 
[self.view sendSubviewToBack:imageView]; 

[imageView release]; 

Điều này sẽ là giải pháp cho vấn đề của bạn.

0

Tôi thực sự thêm một chi nhánh khác vào mã của docchang khi khi iPad được xoay sang chiều dọc của riêng nó, nó sử dụng hình ảnh chân dung bên phải có thể trông hơi lạ. Tôi đã thêm,

if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
    { 
    imageBackgroundView.transform = CGAffineTransformMakeRotation(M_PI/2); 
    } 
else 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
    imageBackgroundView.transform = CGAffineTransformMakeRotation(-M_PI/2); 
    } 
    else 
    if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
    imageBackgroundView.transform = CGAffineTransformMakeRotation(M_PI); 
    } 
    else 
     { 
     imageBackgroundView.transform = CGAffineTransformMakeRotation(0); 
     } 
0

Điều thú vị là các lập trình viên khó có thể suy nghĩ bên ngoài hộp (theo nghĩa đen trong trường hợp này).

Hãy thử cách này (cách tôi tự giải quyết vấn đề này).

  1. Tạo một hình ảnh vuông.
  2. Đặt những hạn chế của UIImageView để điền vào màn hình (hàng đầu, đuôi, trên, dưới)
  3. Đặt chế độ khía cạnh lấp đầy (mà sẽ phóng to hình ảnh, nhưng giữ tỉ lệ cố định của nó)

Xong.

Điều quan trọng ở đây là, bạn nên tạo hình vuông (như tôi đã nói ở trên, bên ngoài hộp ;-)

Các vấn đề liên quan