美文网首页iOS 实用技术其它技术点iOS 控件封装
全网首发 iOS自定义statusbar上icon的颜色

全网首发 iOS自定义statusbar上icon的颜色

作者: WELCommand | 来源:发表于2017-07-22 18:29 被阅读682次

先上github   WELCustomStatusbarColor

大概就是这样

我必须先说一句,iOS的statusbar的颜色默认只有黑和白,我相信这样的设计自然有其原因。而非黑&白的配色设计也同样有其原因,对吧?

接着说写这个项目的动机。起初,只是想获取statusbar的TouchUP事件。在所有已知的常规方法的都能解决的情况下,我决定去私有层看看。当然,这个简单的需求自然是很快便解决了。而已然进入了私有层,作这么个小东西还不是很过瘾,必须要干点什么事出来。于是就有了这个项目。

只需要阅读其头文件,再加上下几的断点,就找到了对应的方案。

大概流程就是:bar上的东西最后都会作为UIImag传给bar(具体的实现比这个复杂一些),钩这个方法,把图片渲染成相应的颜色。而需要改颜色的时候,调用setNeedsStatusBarAppearanceUpdate就可以了。

真实开发中应该不会遇见这种需求,不过做这个项目的逻辑却是经常会用到的,尤其是遇见一些恶心的需求,可以帮我们省下大量的时间。我会在接下来的几篇文中为大家介绍我在项目中是怎么用runtime解决问题的。希望可以为诸位带来帮助。

## Update 

再更新几个关于statusbar的知识,算是需求经常会遇见的。

1 view怎么遮挡statusbar

当你弹出一个全屏的半透明黑色蒙版并且statusbar是白色的时候,这个问题就是你需要考虑的了。

不注意的话,可能就会做成这样

在我司,半透明蒙版挡不住bar绝逼是不能上架的....

2 怎么更改statusbar的背景色

当你的scrollView滑动的同时会隐藏navBar的时候,这个问题你可能会遇到。

几年前蠢的很,在上面放了20pt高的view。不过显然有简单的办法。

大概是这么个需求

3 怎么自由改statusbar的Frame

这个就不放图了,脑补scrollView和statusbar一起比翼齐飞的效果。

先想了这么几个问题,下面一一解答。

首先,statusbar到底是个什么东西呢?

打开开发利器 iOS-Runtime-Headers 阅读UIApplication的头文件,可以发现UIApplication有一个名为statusBar的属性。

获取之, po之,可以发现如下信息:

也就是说,其实statusBar就是个view。

继续po,可以发现如下信息:

到这里,事实已经很明显了。

有一个类型为UIStatusBarWindow的window被UIApplication的单例强引用,在这个window上面add了statusbar这个View。

如果调用下面这句代码

[[UIApplication sharedApplication] setValue:nil forKey:@"_statusBarWindow"];

会发现app的statusbar没有了,原因很简单,一个window的引用计数器为0的时候,便会被系统干掉。

有了这些认识,我们可以回答上面的问题了。

先说window,UIStatusBarWindow的windowLevel是1000,等于UIWindowLevelStatusBar。

(UIWindowLevelNormal == 0; UIWindowLevelAlert == 2000)

要想遮挡statusbar,只需要把显示用的view加到windowLevel > 1000的window上显示。

当然,不光是视觉上遮挡,statusbar的手势也会被遮挡。这个特性有时候可能会很有用,比如我这正在做的一个项目,有个页面是弹出一个卡片,卡片距离屏幕顶部只有50pt左右,需求希望可以通过点击顶部消失卡片。如果这个卡片加在NormalLevel的window上,那么点击顶部有一半几率会点到statusbar上,效果就很不理想。这时候放在AlertLevel的window上就很合适。

既然statusbar是个View,那理论上view可以做的,statusbar也可以做。

比如 改背景颜色这样就可以实现。改frame同理。

UIView *statusbar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];

statusbar.backgroundColor= [UIColor redColor];

如果大家还有什么关于statusbar的问题,可以在评论里留言,我会一一解答。

感谢阅读!

相关文章

网友评论

  • petry:iPhoneX以后的机型就不起作用了,发现iPhoneX以后的statusBar改变很大,不知道从何处着手了,希望楼主哪天能兼容X+,load里面写上注释那就更完美了!
  • 霖溦:原来自定义浮层就注意到这个了,所以后来用window自定义弹窗,不过发现操控window并不明智,探索了下系统的alertController,改成了用视图控制器来做弹层,iOS8以上的半透明modal还是很好的选择的。
    霖溦:@WELCommand 还有个更恶心的,就是和键盘的冲突问题,系统的键盘弹出时(也是个window),再弹出alert,键盘一般会回收,除非是带输入框的alert,这是为了防止遮盖问题,我曾经打印过键盘的windowLevel,非常巨大的一个数值,曾经为了做到能遮盖键盘,还着实恶心了一把。有时会有这样的场景,输入密码错误,自定义alert弹出,键盘回收,不回收键盘一般alert会被键盘遮盖,alert关闭,键盘自动恢复弹出,为了控制键盘,也是找了半天方法,才找到了合适的简易的,不侵入业务逻辑,直接像系统的alert那样自带这个开关键盘属性的方法……
    霖溦:@WELCommand 有遇到这么几个问题,如果把自定义的level设置的比alert高,会遮盖系统的alert,有时候会出问题。window之间的切换,系统并没有提供直接的方法,只能通过makeKey,销毁一个window也没有直接的方法,系统的resignKeyWindow方法不能直接使用。还遇到过一个比较恶心的,就是因为自定义是独立的window,而且window要显示必须为keyWindow,此时调用appdelegate的keywindow方法去找寻rootVC来进行全局页面跳转时,很容易引发崩溃,为什么会出现这种情况呢,别问我,不是我设计的……这类隐患还有很多,曾经引发过我们一次比较致命的线上问题……总之,我觉得,凡是系统没有推荐的,能不用尽量避免用,的确有一点道理,至少安全。
    WELCommand:操控window不明智。可以说的详细些吗?有什么坑可以分享下呗:smile:
  • xiang天问:网上搜了好多,也都试着改了,不行,就是不显示,不知道为啥了,addSubview,bringSubviewToFront,都试过。
    WELCommand:@tianwen_sprite 抱歉 这个帮不了你了 自己调试吧
    xiang天问:@WELCommand 一般都是用addsubview的,我用这个不行,添加的不显示,才试了其他的几种方法,同样不行;不知道到底怎么回事儿。我就只显示一张图片都不行。
    WELCommand:我需要更多的信息。有可能是[UIApplication sharedApplication].keyWindow 为nil? 比如在- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 下调用[self.window makeKeyAndVisible];之前就add了?
  • xiang天问:你好,我这2天遇到一个问题,添加子view不显示,都试过了, [ [ [ UIApplication sharedApplication ] keyWindow ] addSubview : imgView ] ;
  • nenhall:不錯,但只能自己看看,上不了架:crying_cat_face:
    nenhall:還有不允許狀態欄兩種顏色之外的顏色
    nenhall:你不是說用了私有api,不允許使用私有api
    WELCommand:可以上架的:smile:
  • 扛支枪:商业膜拜一下!:joy:
  • si1ence:牛逼!膜拜大神!早就想学runtime了
    WELCommand:@si1ence 商业互吹.....

本文标题:全网首发 iOS自定义statusbar上icon的颜色

本文链接:https://www.haomeiwen.com/subject/junqhxtx.html