7

Tôi có UIViewController trên ipad với cấu hình này:willRotateToInterfaceOrientation không được gọi từ giới viewController

shouldAutorotate (true) supportedInterfaceOrientations (UIInterfaceOrientationMaskAll) và bên willRotateToInterfaceOrientation tôi thực hiện một số thủ thuật để điều chỉnh giao diện của tôi.

Từ con của bộ điều khiển này, tôi hiển thị QuickLookController với mã -poor- này.

[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:previewController animated:YES completion:nil]; 

Nhưng nếu tôi xoay ipad phương pháp willRotateToInterfaceOrientation không được gọi, Vì vậy, tôi không thể thực hiện thủ thuật để điều chỉnh giao diện.

Ai đó có thể giải thích cho tôi hoặc cho tôi một số lời khuyên? nhờ

Trả lời

12

Lý do: Có thể có nhiều khả năng xảy ra sự cố này.

1) Nếu của viewController xem bạn là một subView của một số khác rootViewController mà không phải là một navigationController, sau đó có thể có cơ hội mà cuộc gọi luân chuyển không được tuyên truyền để điều khiển của subview.

2) Một nơi nào đó tôi đọc rằng nếu phương pháp Super không được gọi đúng nơi cần thì có thể là nguyên nhân của sự cố xoay vòng, có nghĩa là tất cả ViewControllers trong ngăn xếp xem có liên quan đến autorotation phải gọi phương thức super trong việc triển khai phương thức (tức là gọi [super viewDidLoad] từ ViewController's viewDidLoad).

Bạn có thể sử dụng mẹo dưới đây để xử lý các thay đổi định hướng.

Đăng ký trình thông báo trong chế độ xemWillAppear.

-(void)viewWillAppear:(BOOL)animated{ 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];} 

Thay đổi hướng sẽ thông báo cho chức năng bên dưới.

- (void)orientationChanged:(NSNotification *)notification{ 
[self handleOrientation:[[UIApplication sharedApplication] statusBarOrientation]];} 

sẽ gọi phương thức dưới đây để bạn có thể xử lý các thay đổi định hướng.

- (void) handleOrientation:(UIInterfaceOrientation) orientation { 

     if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) 
     { 
      //handle the portrait view  
     } 
     else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
     { 
      //handle the landscape view 
     } 
    } 
+0

Lý do số 2 giải quyết được sự cố của tôi ... Siêu phải được gọi là – lucaslt89

4

Tôi tìm thấy một đoạn trên tài liệu táo:

Nếu nội dung điều khiển xem của bạn không phải là trên màn hình khi xoay xảy ra, sau đó nó không thấy danh sách các thông điệp xoay. Ví dụ: xem xét chuỗi sự kiện sau đây:

  • Trình điều khiển chế độ xem hiển thị toàn bộ nội dung của bộ điều khiển chế độ xem khác.
  • Người dùng xoay thiết bị để hướng giao diện người dùng thay đổi.
  • Ứng dụng của bạn loại bỏ trình điều khiển chế độ xem được trình bày.

Trong ví dụ này, bộ điều khiển xem trình bày không hiển thị khi xoay vòng xảy ra, do đó, nó không nhận được bất kỳ sự kiện xoay nào. Thay vào đó, khi nó xuất hiện trở lại, các khung nhìn của nó chỉ đơn giản là thay đổi kích thước và định vị bằng cách sử dụng quy trình bố trí khung nhìn bình thường. Nếu mã bố cục của bạn cần biết hướng hiện tại của thiết bị, nó có thể đọc thuộc tính statusBarOrientation của đối tượng ứng dụng để xác định hướng hiện tại.

mà nói vấn đề của tôi là chính xác những gì, vì vậy tôi thêm một số logic bên trong - (void) viewWillAppear: (BOOL) hoạt hình để điều chỉnh bố trí của tôi nếu có điều gì is'n ở đúng nơi.

0

Đảm bảo bộ điều khiển chế độ xem của bạn được thêm làm con của trình điều khiển chế độ xem gốc, sau đó thư được chuyển xuống.

[rootViewController addChildViewController:viewController]; 
Các vấn đề liên quan