如何检测 UIStatusBar 隐藏和显示?

Posted

技术标签:

【中文标题】如何检测 UIStatusBar 隐藏和显示?【英文标题】:How can I detect UIStatusBar hide and show? 【发布时间】:2012-10-01 16:17:30 【问题描述】:

我正在尝试检测 iPhone 的 UIStatusBar 的隐藏和显示,但失败了。是否有任何解决方案可以帮助我,例如 KVO 或其他?

【问题讨论】:

【参考方案1】:

您可以观察共享UIApplication 实例的statusBarHidden 属性。

简单示例:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    // Do something here...


- (void)viewDidLoad

    [super viewDidLoad];

    [[UIApplication sharedApplication] addObserver:self forKeyPath:@"statusBarHidden" options:NSKeyValueObservingOptionNew context:NULL];
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; // Will notify the observer about the change

【讨论】:

其实我在使用MPMoviePlayerController的时候就遇到了这个问题。我将moviePlayer设置为全屏并想在MPCenteringNavigationBar显示时做点什么 "-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context" 这个函数只被调用了两次。跨度> 有没有办法让这个实现适用于 [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide] ? 这不起作用。 UIApplication 不会通知观察者关于 statusBarHidden 的更改。【参考方案2】:

ios 11 起,您可以继承视图控制器的 UIView 并覆盖 safeAreaInsetsDidChange

override func safeAreaInsetsDidChange() 
  super.safeAreaInsetsDidChange()
  // adapt your view

您的视图必须与状态栏共享顶部矩形才能正常工作。 (但如果没有,您可能无论如何都不需要检测更改)。

【讨论】:

statusBarFramesafeArea 不一样。【参考方案3】:

在 UIApplication 类中有一个属性 statusBarHidden...这告诉状态栏是否隐藏...如果它返回 YES 意味着状态栏被隐藏...试试这个。

【讨论】:

【参考方案4】:

iOS 13

由于 iOS 13 已弃用 isStatusBarHiddensetStatusBarHidden,因此您可以使用 UIStatusBarManager.isStatusBarHiddenTimer 检查状态栏的可见性,因为 KVO 不支持:

timer = Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true)  timer in
    if let statusBarManager = UIApplication.shared.delegate?.window??.windowScene?.statusBarManager 
        print(statusBarManager.isStatusBarHidden)
    

【讨论】:

以上是关于如何检测 UIStatusBar 隐藏和显示?的主要内容,如果未能解决你的问题,请参考以下文章

UIStatusBar样式与UINavigationBar一致

UIStatusBar iOS上状态栏的自定义颜色

如何在 iOS 应用程序中完全删除 UIStatusBar?

隐藏 UIStatusBar / 移动 UINavigationBar

如何检测 UI 图像上的触摸?

如何检测键盘是不是显示在 Xcode UI 测试中