如何检测 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
您的视图必须与状态栏共享顶部矩形才能正常工作。 (但如果没有,您可能无论如何都不需要检测更改)。
【讨论】:
statusBarFrame
和 safeArea
不一样。【参考方案3】:
在 UIApplication 类中有一个属性 statusBarHidden...这告诉状态栏是否隐藏...如果它返回 YES 意味着状态栏被隐藏...试试这个。
【讨论】:
【参考方案4】:iOS 13
由于 iOS 13 已弃用 isStatusBarHidden
和 setStatusBarHidden
,因此您可以使用 UIStatusBarManager.isStatusBarHidden
和 Timer
检查状态栏的可见性,因为 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一致
如何在 iOS 应用程序中完全删除 UIStatusBar?