2013-09-25 38 views
11

Các iOS 7 Transition Guide đưa ra một gợi ý tốt như thế nào để thay đổi UIStatusBarStyle động trong một UIViewController sử dụngLàm thế nào để thay đổi UIStatusBarStyle trong iOS 7 trong chế độ xem phương thức với thanh điều hướng?

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleDefault; 
} 

cùng với [self setNeedsStatusBarAppearanceUpdate];

này hoạt động tốt trong một ứng dụng xem duy nhất. Tuy nhiên, tôi hiện đang cố gắng thay đổi UIStatusBarStyle trong chế độ xem phương thức thành UIStatusBarStyleLightContent. Có một số MainViewController phân biệt với số ModalViewController, chính nó được nhúng trong một số NavigationController. ModalViewController đã đặt đại biểu của mình cho số MainViewController.

Tôi cố gắng để gọi [self setNeedsStatusBarAppearanceUpdate]; trong ModalViewController cùng với các phương pháp sau đây trong lớp đó không có hiệu lực:

// In ModalViewController.m 
- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 

Tôi cũng đã cố gắng gọi [self setNeedsStatusBarAppearanceUpdate]; trong MainViewController trên prepareForSegue: sender: phương pháp với điều kiện trong - (UIStatusBarStyle)preferredStatusBarStyle {} trở UIStatusBarStyleLightContent khi chế độ xem phương thức được trình bày - nhưng điều đó cũng không có hiệu ứng.

Làm cách nào để thay đổi UIStatusBarStyle trong chế độ xem phương thức?

EDIT: bài viết Cập nhật: tôi cần phải đề cập đến rằng ModalViewController được nhúng vào trong một NavigationController với một NavigationBar. Với NavigationBar đặt thành ẩn ở trên cuộc gọi của [self setNeedsStatusBarAppearanceUpdate]; trong ModalViewController hoạt động tốt. Nhưng không phải khi Bar có thể nhìn thấy.

+0

Bạn gọi [self setNeedsStatusBarAppearanceUpdate] trong triển khai ModalViewController ở đâu? – Moxy

+0

Trong phương thức 'viewDidLoad' – FrankZp

+0

Còn về' -viewWillAppear: '? – Moxy

Trả lời

27

Bạn cần một ViewController hiển thị trong Chế độ toàn màn hình để trả về các thanh trạng thái thích hợp. Trong trường hợp của bạn: NavigationController chứa ModalViewController cần phải thực hiện preferredStatusBarStyle và trả lại UIStatusBarStyleLightContent.

Chỉ cần gọi đến setNeedsStatusBarAppearanceUpdate nếu giá trị mà bộ điều khiển chế độ xem thực sự thay đổi. Khi bộ điều khiển xem lần đầu tiên được trình bày, chúng vẫn được truy vấn.

+0

Bạn đã lưu tôi một loạt thời gian ngay bây giờ. Các ứng dụng iOS 7 cũng cần hỗ trợ iOS 6 thì rất khủng khiếp. Cảm ơn nhiều! – Craimasjien

+1

Làm cách nào để triển khai ưu tiênStatusBarStyle trong AppDelegate của tôi? Tôi có một TabBarViewController dẫn đến 4 NavControllers dẫn đến UIViewControllers, tôi nên cố gắng này trong một lớp học cho Tab Bar? trong Navcontrollers? hoặc trong AppDelegate? -Tôi cần tất cả các thanh trạng thái được đặt thành LightContent – Chisx

+0

Trong trường hợp của bạn, đó có thể là lớp con của TabBarViewController phải thực hiện 'preferredStatusBarStyle' – jaetzold

1

Có vẻ như ứng dụng sẽ tắt statusBarStyle của chế độ xem trên cùng trên cùng. Vì vậy, nếu bạn thêm một viewController khác trên đầu trang hiện tại của bạn, nó bây giờ nhận được các dấu hiệu của nó từ viewController mới.

11

Chìa khóa để thực hiện công việc này là chỉ có bộ điều khiển chế độ xem toàn màn hình mới có thể đọc được kiểu dáng của thanh trạng thái.

Nếu bạn đang sử dụng bộ điều khiển điều hướng và muốn điều khiển thanh trạng thái trên cơ sở bộ điều khiển xem, bạn sẽ muốn phân lớp UINavigationController và triển khai priorityStatusBarStyle sao cho nó trả về tùy chọn của topViewController.

Đảm bảo bạn thay đổi tham chiếu lớp trong cảnh kịch bản của bạn từUINavigationController thành lớp con của bạn (ví dụ: MyNavigationController trong ví dụ bên dưới).

(Các công trình sau đây dành cho tôi. Nếu ứng dụng của bạn là TabBar, bạn sẽ muốn làm điều gì đó tương tự bằng cách phân lớp UITabBarController nhưng tôi chưa thử điều đó).

@interface MyNavigationController : UINavigationController 

@end 

@implementation MyNavigationController 

- (UIStatusBarStyle)preferredStatusBarStyle 
{ 
    return self.topViewController.preferredStatusBarStyle; 
} 

@end 
+0

Phân lớp UINavigationController hoạt động tốt, cảm ơn! Tôi cũng đã làm một thử nghiệm nhanh với một danh mục. Nó thực sự hoạt động giống như một lớp con. –

2

Tôi có trình điều khiển phụ/bộ điều khiển hiển thị bên (SWRevealController), hóa ra luôn là bộ điều khiển gốc cho truy vấn thanh trạng thái. Ghi đè childViewControllerForStatusBarStyle cho phép tôi định tuyến lại truy vấn đến bộ điều khiển phía trước nhất.

/** 
This view is always considered the topmost for status bar color queries. 
Pass the query along to what we're showing in front. 
*/ 
- (UIViewController *)childViewControllerForStatusBarStyle 
{ 
    UIViewController *front = self.frontViewController; 
    if ([front isKindOfClass:[UINavigationController class]]) 
     return ((UINavigationController*)front).topViewController; 
    else 
     return front; 
} 
0

Chỉ cần nhìn lên nếu rootViewController của ứng dụng của bạn cần phải ghi đè - (UIStatusBarStyle) preferredStatusBarStyle phương pháp

0

Tất cả các công việc trên. Tuy nhiên đôi khi tôi tìm thấy nó thực sự là một cơn đau ở phía dưới để đi và thay đổi mọi trường hợp trong Storyboard vv ... Vì vậy, đây là một cái gì đó mà làm việc cho tôi mà cũng liên quan đến subclassing.

Đầu tiên tạo ra các lớp con:

@interface HHNavLightColorBarController : UINavigationController 

@end 

@implementation HHNavLightColorBarController 

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 
@end 

Sau đó sử dụng sự kỳ diệu của Objective-C và một chút của <objc/runtime.h>

Khi bạn có một tài liệu tham khảo của bộ điều khiển xem và trình bày của bạn:

UINavigationController *navVC = ...; // Init in your usual way 
object_setClass(navVC, [HHNavLightColorBarController class]); 
[self presentViewController:nav animated:YES completion:^{ 
    NSLog(@"Launch Modal View Controller"); 
}]; 

Đôi khi có vẻ như ít xâm phạm hơn một chút. Thậm chí bạn có thể tạo một danh mục kiểm tra xem loại kindOfClass của bạn có phải là trình điều khiển điều hướng hay không và tự động làm điều đó cho bạn. Dù sao, câu trả lời là ở trên bởi jaetzold, tôi chỉ thấy điều này là tiện dụng.

23

Chúng tôi sẽ nhận thấy rằng chế độ không toàn màn hìnhVC CAN sử dụng modalPresentationCapturesStatusBarAppearance để kiểm soát kiểu statusBar.

Bất kỳ ai muốn biết thêm về kiểm soát Thanh trạng thái không được bỏ qua UIViewController Managing the Status Bar.

Cập nhật lúc 2015/11/06:

Và chắc chắn rằng bạn đã thiết lập được mô tả trong UIViewControllerBasedStatusBarAppearanceiOS Keys

+4

Đây phải là câu trả lời được chấp nhận – Raphael

+0

Hoàn hảo, đây chính xác là vấn đề mà tôi đang gặp phải, VC được trình bày tùy chỉnh không thay đổi giao diện thanh trạng thái và chế độ xem trước đó vẫn được truy vấn. – Guykun

1

này làm việc cho tôi:

  1. Đặt View controller-based status bar appearance-NO
  2. Đặt kiểu thanh trạng thái thành UIStatusBarStyleLightContent (chỉ cần sao chép giá trị đó)
  3. Trong appdelegate sử dụng [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Hy vọng nó giúp (ref: ios7 status bar changing back to black on modal views?)

4

Để thay đổi thanh trạng thái của UINavigationController nhúng ViewController của bạn mà không subclassing UINavigationController, sử dụng này:

navigationController?.navigationBar.barStyle = .Black // to make the status bar text white 

. Đen sẽ làm cho văn bản màu trắng (thanh trạng thái và tiêu đề của chế độ xem), trong khi .Default có một tiêu đề màu đen và thanh trạng thái.

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