2010-02-03 27 views
6

Được rồi, điều này có vẻ tương đối đơn giản, nhưng tôi đã được Googling cho phần tốt hơn trong một giờ, và dường như không thể tìm thấy những gì tôi cần.Tắt tự động cho một UIView

Tôi có bộ điều khiển chế độ xem có một vài phần khác nhau: chế độ xem nền, chế độ xem tiêu đề và một vài nút. Bây giờ, tôi muốn các tiêu đề và các nút để autorotate đúng (họ làm, khi tôi trả lại YES từ shouldAutorotateToInterfaceOrientation :), nhưng trong mọi trường hợp không nên xem nền xoay. Có cách nào thích hợp để làm việc này không?

Trả lời

5

Nếu bạn không muốn quay tạm thời chế độ xem nền sau đó nền được thay đổi để có định hướng chính xác, bạn sẽ cần phải tắt Tự động cho Chế độ xem. Không có hai cách về nó.

Bạn cần phải tự xoay vòng các nút. Bạn có thể tạo bố cục đẹp hoặc đặt chúng trên ví dụ như Scrollview và chỉ cần thay đổi kích thước đó.

Dù bằng cách nào, bạn cần phải thêm một người quan sát để xoay nó cho mình,

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) 
               name:UIDeviceOrientationDidChangeNotification object:nil]; 

Và trong didRotate bạn làm thay đổi kích thước, với một sự chuyển tiếp hoạt hình đẹp, nếu bạn muốn.

- (void) didRotate:(NSNotification *)notification { 
int ori=1; 
    UIDeviceOrientation currOri = [[UIDevice currentDevice] orientation]; 
    if ((currOri == UIDeviceOrientationLandscapeLeft) || (currOri == UIDeviceOrientationLandscapeRight)) ori=0; 
} 

Hy vọng rằng sắp xếp bạn. Nếu thanh Điều hướng hoặc thanh trạng thái khiến Chế độ xem bị ẩn trong thanh trên cùng, có nhiều cách để khắc phục điều đó.

+0

Cảm ơn bạn đã đăng bài này, nó đã giải quyết được một vấn đề lớn mà tôi đang gặp phải. Tuy nhiên, tôi đang gặp một vấn đề nhỏ khi thực hiện điều này, bạn có thể xem bài đăng của tôi ở đây không: [link] (http://stackoverflow.com/questions/8114445/app-rotates-incorrectly-when-locked)? – robhasacamera

1

Tôi không biết về cách 'thích hợp', nhưng công việc xung quanh là tạo hình nền vie theo cả hai hướng và chỉ thay đổi chế độ xem nền. Câu hỏi hay - sẽ được quan tâm để xem những gì mọi người đưa ra như một giải pháp.

2

Có một công việc xung quanh mà tôi đã nghĩ về ...

Bạn có thể sử dụng:

bgView.transform = CGAffineTransformMakeRotate(angle); 

Bạn nên tính toán góc theo định hướng (nó có thể là M_PI/2 , M_PI hoặc 3 * M_PI/2) ...

Bạn có thể sử dụng chức năng này bên trong - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration và cũng bọc nó bằng hoạt ảnh sẽ hoạt ảnh trong khoảng thời gian chính xác như hoạt ảnh hướng màn hình:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    // Decide what will be the angle... 

    // Make the animation 
    [UIView beginAnimations:@"orientationChange" context:nil]; 
    [UIView setAnimationDuration: duration]; 
    bgView.transform = CGAffineTransformMakeRotate(angle); 
    [UIView commitAnimations]; 
} 

Chú ý rằng kích thước quan điểm của có thể được thay đổi vì thanh trên cùng ...

Cũng thông báo rằng tôi chưa bao giờ thử nó bản thân mình ...

2

Có cách 'thích hợp': Cho phép khuôn khổ xoay giao diện (khác khôn ngoan bạn sẽ gặp vấn đề khi bật lên một trình điều khiển chế độ xem khác) nhưng ghi đè hoạt ảnh của chế độ xem của bạn.

Tôi có chế độ xem toàn màn hình có chứa mọi thứ tôi không muốn xoay, được gọi là _fixedView. Trong bảng phân cảnh, tôi chắc chắn rằng tất cả tự động hóa (những mũi tên màu đỏ ở 'Trình kiểm tra kích thước') sẽ bị tắt, vì vậy chế độ xem sẽ luôn ở giữa màn hình.

Sau đó, trong điều khiển điểm của tôi, tôi có ghi đè này:

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [UIView animateWithDuration:duration 
        animations:^{ 
     if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
      _fixedView.transform = CGAffineTransformMakeRotation(M_PI_2); 
     } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
      _fixedView.transform = CGAffineTransformMakeRotation(-M_PI_2); 
     } else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
      _fixedView.transform = CGAffineTransformMakeRotation(M_PI); 
     } else { 
      _fixedView.transform = CGAffineTransformIdentity; 
     }}]; 
} 

Bằng cách này tất cả mọi thứ trong _fixedView là hoàn toàn cố định (làm thế nào là cho tên mô tả, eh?) Trong khi thanh trạng thái và thanh công cụ của tôi xoay bình thường.

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