2013-03-08 18 views
8

Tôi có bộ điều khiển chế độ xem sau được thiết lập:Trong iOS6, sự cố khi buộc ViewController đến giao diện nhất địnhĐối tượng khi được đẩy trên ngăn xếp

viewController1 có thể xoay tự do theo bất kỳ hướng nào ngoại trừ ngược chiều dọc.

viewController2 được đẩy lên trên cùng của khung nhìnController1, và tôi muốn cho nó là cùng một hướng xemController1 là và tôi muốn nó không thể xoay.

viewController3 được đẩy lên trên cùng của chế độ xemController2. Tôi muốn cho viewController3 ở chế độ dọc.

Tôi đang gặp nhiều sự cố khi cố gắng thực hiện điều này trong iOS6 (chưa thử trong iOS5). Trước hết, tôi đã tạo Trình điều khiển Điều hướng của chính mình và đặt các mục sau vào trong đó:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [self.topViewController preferredInterfaceOrientationForPresentation]; 
} 

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

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

Tôi đã thử rất nhiều kết hợp khác nhau của những thứ này để biết lịch phát sóng. Chủ yếu là nơi tôi đang đấu tranh là buộc vc3 được trình bày như là chân dung nếu vc2 là trong cảnh quan. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

12

Điều bạn đang cố gắng làm ở đây là chống lại khuôn khổ. Những gì bạn mô tả đơn giản không phải là cách một kiến ​​trúc bộ điều hướng hoạt động trong iOS 6. Nếu bạn muốn hiển thị khung nhìn của trình điều khiển xem và xoay vòng lực, hãy sử dụng một bộ điều khiển khung nhìn được trình bày. Đó là thời điểm duy nhất preferredInterfaceOrientationForPresentation có ý nghĩa và bộ điều khiển của bạn xem supportedInterfaceOrientations sẽ thực sự được tư vấn bởi vì, được trình bày, nó sẽ ở gốc của giao diện.

+1

Vì vậy, bạn có nghĩa là tôi phải đẩy nó như là một modalview để buộc quay của nó? Tôi không thể đẩy nó trên ngăn xếp điều hướng và ép nó? –

+2

Vâng, chính xác, ngoại trừ cách bạn nói: bạn phải * trình bày * nó như những gì được sử dụng để được gọi là một bộ điều khiển xem phương thức, không * đẩy * nó vào ngăn xếp điều hướng. Trình điều khiển chế độ xem được trình bày có thể buộc xoay. Bộ điều khiển chế độ xem được đẩy lên ngăn điều hướng không thể; ứng dụng có thể quyết định cách phản hồi động khi người dùng * xoay thiết bị *, nhưng hành động chỉ đẩy bộ điều khiển chế độ xem vào ngăn điều hướng sẽ không làm cho giao diện ứng dụng xoay vòng. – matt

+0

Bạn có biết liệu có cách nào để buộc bộ điều khiển xem xoay sau khi được trình bày không? Giống như thay vì người dùng xoay nó, hãy tự xoay nó đi? –

5

Tôi đã giải thích trong một câu trả lời khác rằng nó không được hỗ trợ, trong iOS 6, để buộc quay số khi đẩy bộ điều khiển chế độ xem mới vào bộ điều khiển điều hướng. Bạn có thể cấu trúc các quy tắc về việc bù trừ bồi thường (tức là điều gì sẽ xảy ra nếu người dùng xoay thiết bị ), nhưng bạn không thể buộc giao diện để xoay vòng. Tình huống duy nhất trong đó iOS 6 rất vui được cho phép bạn buộc quay số là khi trình bày hoặc loại bỏ bộ điều khiển chế độ xem (presentViewController:animated:dismissViewControllerAnimated:).

Tuy nhiên, bạn có thể sử dụng bộ điều khiển chế độ xem được trình bày theo cách mà loại trông như bạn đang đẩy vào bộ điều khiển điều hướng. Tôi đã thực hiện một bộ phim cho thấy những gì tôi có nghĩa là:

http://youtu.be/O76d6FhPXlE

Bây giờ, đó không phải là hoàn toàn hoàn hảo bởi bất kỳ phương tiện. Không có hoạt ảnh xoay của thanh trạng thái và có một loại "nhấp nháy" màu đen giữa hai chế độ xem - đó là cố ý, bởi vì nó ở đó để che phủ những gì là thực sự là. Điều thực sự xảy ra là có thực sự hai bộ điều khiển điều hướng khác nhauba bộ điều khiển xem, như được hiển thị trong ảnh chụp màn hình này của bảng phân cảnh.

enter image description here

Những gì chúng ta có là:

  • một nav điều khiển lớp con thiết lập để hướng dọc, và điều khiển xem gốc của nó

  • một nav thứ hai điều khiển lớp con thiết lập để định hướng phong cảnh, và bộ điều khiển chế độ xem gốc của nó, có màu đen và có chức năng như một trung gian

  • một bộ điều khiển xem thứ ba được đẩy vào ngăn xếp bộ điều khiển nav thứ hai

Khi người dùng yêu cầu để đi "chuyển tiếp" từ bộ điều khiển xem đầu tiên, chúng tôi trình bày bộ điều khiển chuyển hướng thứ hai, do đó thấy chế độ xem màu đen bộ điều khiển trong giây lát, nhưng sau đó chúng tôi ngay lập tức đẩy bộ điều khiển chế độ xem thứ ba. Vì vậy, chúng tôi nhận được quay cưỡng bức, cùng với một loại đèn flash màu đen và một hình ảnh động đẩy. Khi người dùng chạm vào nút Quay lại trong trình điều khiển chế độ xem thứ ba, chúng tôi sẽ đảo ngược quy trình.

Tất cả mã chuyển tiếp nằm trong bộ điều khiển chế độ xem màu đen (ViewControllerIntermediary). Tôi đã cố gắng để tinh chỉnh nó để cung cấp cho các hoạt hình thỏa mãn nhất mà tôi có thể:

@implementation ViewControllerIntermediary { 
    BOOL _comingBack; 
} 

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationController.delegate = self; 
} 

-(void)navigationController:(UINavigationController *)nc 
     willShowViewController:(UIViewController *)vc 
     animated:(BOOL)anim { 
    if (self == vc) 
     [nc setNavigationBarHidden:YES animated:_comingBack]; 
    else 
     [nc setNavigationBarHidden:NO animated:YES]; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (!_comingBack) { 
     [self performSegueWithIdentifier:@"pushme" sender:self]; 
     _comingBack = YES; 
    } 
    else 
     [self.navigationController dismissViewControllerAnimated:YES 
      completion:nil]; 
} 
1
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
if ([self.window.rootViewController.presentedViewController isKindOfClass: [SecondViewController class]]) 
{ 
    SecondViewController *secondController = (SecondViewController *) self.window.rootViewController.presentedViewController; 

    if (secondController.isPresented) 
     return UIInterfaceOrientationMaskAll; 
    else return UIInterfaceOrientationMaskPortrait; 
} 
else return UIInterfaceOrientationMaskPortrait; 
} 

Và đối với Swift

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow) -> Int { 

    if self.window?.rootViewController?.presentedViewController? is SecondViewController { 

     let secondController = self.window!.rootViewController.presentedViewController as SecondViewController 

     if secondController.isPresented { 
      return Int(UIInterfaceOrientationMask.All.toRaw()); 
     } else { 
      return Int(UIInterfaceOrientationMask.Portrait.toRaw()); 
     } 
    } else { 
     return Int(UIInterfaceOrientationMask.Portrait.toRaw()); 
    } 

} 

Để biết thêm chi tiết kiểm tra này link

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