2014-11-06 55 views
0

我知道有一些关于此问题的问题,但没有人帮助我解决特定问题。我想在整个屏幕上方显示自定义模式,但我想保持Apple状态栏可见。对于模式,我使用一个UIView进行调光效果,另一个用于用户与之交互的实际视图。然后将整个模态作为子视图添加到当前视图中并显示在前面。基本上,我试图复制UIAlertView的行为,除了自定义视图。下面是我的一些代码:在iOS中显示UIView在苹果状态栏上8

var modalView:UIView = UIView(frame: self.view.window!.bounds) 
modalView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.66) 
modalView.addSubview(customView)  

self.view.window!.addSubview(modalView) 
modalView.window!.windowLevel = UIWindowLevelStatusBar + 1 

self.bringSubviewToFront(modalView) 

以上,customView是用户与之交互的UIView

这很好,但由于某些原因,即使状态栏的样式设置为LightContent,Apple状态栏上的文本也会消失。从代码中可以看出,我没有触及状态栏。

我想让状态栏上的文字变暗,就像屏幕的其他部分一样,我目前卡住了。有没有人有任何关于如何获得理想行为的见解?

任何帮助将不胜感激!

+1

你可以尝试去一个水平和执行机制的一个新的UIWindow内。下面是这种方法的一些注意事项:http://stackoverflow.com/q/8232398/1442620 – 2014-11-06 14:38:17

回答

4

EDIT(2015年11月16日)

我从this线程复制我的回答如下:在iOS的

这个答案休息8.3+和iOS 8的可能是以前的版本我不推荐任何人都使用它,特别是因为它不能保证在未来的iOS版本中工作。

我的新解决方案使用UIViewController的标准presentViewController方法。我初始化一个UIViewController,添加我的自定义模态View作为UIViewController的子视图,然后可选地使用约束来定位模态View。奇迹般有效!


原来的答案

继安娜的建议,我把它用的UIWindow代替UIView.这是我的新代码的工作:

var modalWindow:UIWindow = UIWindow(frame: self.view.window!.bounds) 

modalWindow.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.66) 
modalWindow.hidden = false 
modalWindow.windowLevel = (UIWindowLevelStatusBar + 1) 

modalWindow.addSubview(customView)  

modalWindow.makeKeyAndVisible() 

它现在的作品与之前完全相同, Apple状态栏上的文字也会变暗。非常感谢您的帮助!

+0

只是一个快速提示:要隐藏窗口,请将'modalWindow'设置为'nil',如下所示: 'modalWindow =无' – Alexander 2014-11-07 13:49:15

+0

你设法处理这个临时uiwindow的旋转?请检查我的问题http://stackoverflow.com/questions/26976494/ios-8-7-uiwindow-with-uiwindowlevelstatusbar-rotation-issue – 2014-11-18 07:54:04

+0

应该在iOS 9中工作吗? – zzzel 2015-11-16 21:49:07

4

更新2017年12月•斯威夫特4•iOS的10.0+

我简要地尝试接受答案的编辑解决方案,但我不能轻易使整个的viewController只是一个UIView旗帜。但是,通过访问UIApplication中的statusBar值,我能够将UIView作为子视图添加到statusBarView这会将UIView置于状态栏的顶部。据我所知,这是一个相对稳定的解决方法,适用于最新的几个iOS版本。

extension UIApplication { 

    /// Returns the status bar UIView 
    var statusBarView: UIView? { 
     return value(forKey: "statusBar") as? UIView 
    } 

} 

使用

let customBannerView = CustomStatusView(with: message) 
UIApplication.shared.statusBarView?.addSubview(customBannerView)