在iOS 7上添加UIView横幅到状态栏以上

25

我正在尝试在收到应用内推送通知时,在状态栏上方添加一个横幅。根据我所阅读的内容,似乎在 iOS 7 中动态更改状态栏样式的唯一方法是将 UIViewControllerBasedStatusBarAppearance 设置为 NO。这不仅很烦人,需要更改所有不同的视图控制器 prefersStatusBarHidden[UIApplication sharedApplication].statusBarHidden,而且也不会产生我想要的效果。

当横幅从顶部滑动时,我仍希望状态栏提供的20个点的空间保留下来,但状态栏的内容消失,直到横幅再次向上滑动。是否有一种方法可以实现这一点或在状态栏之上添加子视图或窗口?

基本上我想要做到这一点:

Facebook Messenger push banner

3个回答

46

将您的视图控制器置于状态栏之上:

[[[[UIApplication sharedApplication] delegate] window] setWindowLevel:UIWindowLevelStatusBar+1];
将您的视图控制器置于状态栏后面:
[[[[UIApplication sharedApplication] delegate] window] setWindowLevel:UIWindowLevelNormal];

1
谢谢Nico!!为启动图像制作截图时,将状态栏设为透明或隐藏在窗口后面非常有帮助!你救了我的一天。 - boweidmann

33

创建一个新的窗口,将你的横幅视图添加到该窗口中。需要显示横幅时,可以设置 yourwindow.hidden = NO;。您还可以添加动画来显示横幅和关闭横幅 yourwindow.hidden = YES;

关键在于设置 yourwindow.windowLevel = UIWindowLevelStatusBar+1;

这将确保您的横幅视图和 yourwindow 始终出现在状态栏上方。

如有任何疑问,请随时提问。


非常感谢!这行代码 yourwindow.windowLevel = UIWindowLevelStatusBar+1; 是关键。作为后续,横幅显示之前状态栏样式是白色的,但一旦横幅出现并消失后就会变成黑色。我该如何强制状态栏再次变为白色而不必离开屏幕并返回? - mverderese
算了,我之前写的是[window makeKeyAndVisible]而不是window.hidden = NO;。现在已经可以完美运行了! - mverderese
嘿 @dezinezync ,当我想显示自定义状态视图时,如何将我的自定义 UIWindow 添加到我的视图中? - Weizhi
1
@dee,你不需要将它添加到任何特定的视图中。你只需使用myWindow.hidden = NO即可。如果你愿意,你可以调整窗口的框架位置,使其看起来像是你的视图的一部分。我可能错了,因为UIWindow是一个专门的UIView,但在撰写本文时,这就是我会做的方式。 - dezinezync
@dezinezync,感谢您的回答。我有些困惑,难道不需要将窗口添加到其父视图中才能显示它吗?我按照您的提示操作,可以在不将其附加到父视图的情况下显示窗口,但是当我更新窗口的子视图时,子视图不会改变。为什么呢? - Weizhi
uiwindow覆盖状态栏在竖屏模式下运行良好,但如何处理旋转?请查看我的问题http://stackoverflow.com/questions/26976494/ios-8-7-uiwindow-with-uiwindowlevelstatusbar-rotation-issue - Hashmat Khalil

4
在Swift4中,在状态栏上方添加UIView横幅
func showBannerView(bannerView:UIView){
     let window = UIApplication.shared.keyWindow!
    window.addSubview(bannerView)
    window.windowLevel = UIWindowLevelStatusBar+1
}
func removeBannerView(bannerView:UIView){
    bannerView.removeFromSuperview()
    let window = UIApplication.shared.keyWindow!
    window.windowLevel = UIWindowLevelStatusBar - 1

} 

iPhone X该怎么做? - christijk
在 iPhone X 上使用此横幅视图内容时,您需要添加30像素的顶部填充。 - Thomas Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接