07/09/2018, 15:29

Ẩn hiện status bar trong iOS

Nhân một dịp làm với status bar iOS, mình muốn điên lên với nó. Không hiểu cơ chế nó chạy thế nào và hàm nào để set. Và sau khi search tìm hiểu mãi cuối cùng mình thấy no chạy thế nào. Bài viết này tổng hợp lại những hiểu biết của mình về việc ẩn hiện status bar trong iOS 7 trở về sau. Trước đây, ...

Nhân một dịp làm với status bar iOS, mình muốn điên lên với nó. Không hiểu cơ chế nó chạy thế nào và hàm nào để set. Và sau khi search tìm hiểu mãi cuối cùng mình thấy no chạy thế nào. Bài viết này tổng hợp lại những hiểu biết của mình về việc ẩn hiện status bar trong iOS 7 trở về sau.

Trước đây, để set status bar ẩn hiện các bạn sẽ dùng hàm:

Swift
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.Fade)

Objective-C

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

Từ iOS7 trở đi Apple cung cấp cho ViewController khả năng thay đổi style và ẩn hiện Status bar. Và đây chính là thứ khiến mình hỗn loạn, sau một hồi tìm hiểu bí kíp nằm ở đây:

If you prefer to opt out of having view controllers adjust the status bar style—and instead set the status bar style by using the UIApplicationstatusBarStyle method—add the UIViewControllerBasedStatusBarAppearance key to an app’s Info.plist file and give it the value NO.
Nguồn
Từ iOS7 trở đi các bạn phải setting biến View controller-based status bar appearance trong file .plist. Biến này là biến BOOL.

  1. View controller-based status bar appearance = YES. Lúc này ViewController sẽ handle việc ẩn hiện status bar. Nhiệm vụ của bạn là phải override lại hàm: ##### Swift
    override func prefersStatusBarHidden() -> Bool {
        return shouldHideStatusBar
    }
Objective-C
 - (BOOL)prefersStatusBarHidden {
    return shouldHideStatusBar;
}

Khi muốn thay đổi trạng thái các bạn sẽ gọi:

##### Swift

 shouldHideStatusBar = true/false
 self.setNeedsStatusBarAppearanceUpdate()

##### Objective-C

 shouldHideStatusBar = YES/NO
[self setNeedsStatusBarAppearanceUpdate];
  1. View controller-based status bar appearance = NO. Lúc này các bạn xài giống như bình thường trước đây.

Lưu ý: Khi các bạn dùng cách 1 thì khi các bạn gọi:

Swift
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.Fade)
Objective-C
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

sẽ không hoạt động và ngược lại.

0