9

Tất cả các bộ điều khiển chế độ xem trong ứng dụng của tôi chỉ hoạt động theo hướng dọc ngoại trừ một trình điều khiển có thể được đặt dọc hoặc ngang.iOS: Thay đổi hướng giao diện khi trình điều khiển chế độ xem pop

Tôi có một số kịch bản sử dụng như sau:

  1. Tôi đẩy điều khiển mà làm việc trong cả hai định hướng đến UITabBarController
  2. tài khoản thay đổi hướng từ portait đến cảnh quan
  3. tài khoản nhấn "nút quay lại"

Sau khi ứng dụng tác vụ này vẫn ở hướng ngang và không tự động thay đổi thành dọc.

Tôi kiểm soát hướng điều khiển chế độ xem bằng cách sử dụng hỗ trợInterfaceOrientations (Tôi sử dụng iOS 6.0). Tôi đã làm gì sai? Làm thế nào tôi có thể có được hành vi đúng khi ứng dụng tự động thay đổi định hướng cho phép khi người dùng nhấn nút quay lại? Cảm ơn bạn đã trả lời!

+0

Hãy xem liên kết này [http://stackoverflow.com/questions/12650137/how-to-change-the-device-orientation-programmatically-in-ios-6](http://stackoverflow.com/question/12650137/how-to-change-the-device-orientation-programmatically-in-ios-6) –

+0

Kịch bản này được giải thích trong tài liệu của Apple [ở đây] (https://developer.apple.com/library/ ios/featuredarticles/ViewControllerPGforiPhoneOS/RespondingtoDeviceOrientationChanges/RespondingtoDeviceOrientationChanges.html # // apple_ref/doc/uid/TP40007457-CH7-SW13). –

Trả lời

2

Trong iOS 6 (và có thể sớm hơn), nếu bộ điều khiển chế độ xem bị tắt khi thiết bị quay, thiết bị sẽ không nhận được bất kỳ thông báo nào. Nó cũng không được gửi willAnimateRotationToInterfaceOrientation:duration: khi nó trở thành bộ điều khiển xem trên cùng.

Bạn cần phải theo dõi hướng hiện tại của bộ điều khiển chế độ xem và kiểm tra hướng thiết bị trong viewWillAppear:. Nếu chúng khác nhau, bạn có thể sử dụng willAnimateRotationToInterfaceOrientation:duration: để đặt chính xác.

Vì đây là điều bạn có thể làm rất nhiều, bạn có thể muốn tạo một lớp cha mẹ chung mà bộ điều khiển chế độ xem của bạn kế thừa từ đó.

Một giải pháp điển hình là:

@implementation MyHandlesOffscreenRotationController 
{ 
    BOOL isShowingPortrait; 
} 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    isShowingPortrait = UIInterfaceOrientationIsPortrait(
         [[UIApplication sharedApplication] statusBarOrientation]); 
} 


- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

     BOOL currIsPortrait = UIInterfaceOrientationIsPortrait(
           [[UIApplication sharedApplication] statusBarOrientation]); 

    if ((isShowingPortrait && !currIsPortrait) || 
     (!isShowingPortrait && currIsPortrait)) { 
     [self willAnimateRotationToInterfaceOrientation: 
       [[UIApplication sharedApplication] statusBarOrientation] 
               duration:0.0f]; 
    } 
} 

@end 
+0

Đây là câu trả lời hợp lý, bạn phải đặt 'isShowingPortrait' sau khi bạn xoay, vì vậy nó được cập nhật. nếu không nó sẽ chỉ làm việc một lần. (cũng hoạt động cho ios7) – zero3nna

1

Chỉ cần ghi đè -(BOOL)shouldAutoRotate and - (NSUInteger)supportedInterfaceOrientations bên trong một loại UINavigationController, sau đó ViewController sẽ buộc xoay để định hướng hỗ trợ của nó sau khi pop từ ViewController khác.

@implementation UINavigationController (Rotate) 

- (BOOL)shouldAutorotate 
{ 
    return [self.topViewController shouldAutorotate]; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
2

iOS 9 trở lên

Tại thời điểm pop chỉ cần viết đoạn code dưới đây đề cập trong viewWillAppear phương pháp của bạn.

[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]forKey:@"orientation"]; 

Với điều này, chế độ xem của bạn sẽ xuất hiện ở chế độ dọc.

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