美 CRY,给 iOS 状态栏增加 Vibrance 效果

Apple Music 的正在播放界面可谓是十分漂亮,它的状态栏感觉就像是深度定制过的一样,可以随着专辑封面的主题色变幻整体和局部的颜色。

本文就将介绍如何定制你的状态栏,先看下面这个界面:

是不是感觉哪里怪怪的?我在标题栏的位置使用了自定义模糊效果(UIVisualEffectView),Label 上使用了 Vibrance 效果,这是 WWDC 中苹果推荐配合 Blur 效果使用的一种效果,可以使模糊视图上的文字或内容更清晰。但是我们的状态栏在这里却是格格不入,十分扎眼。所以我想给它也加上 Vibrance 的效果。

Hack Step 0.

首先,要定制状态栏,我们要找到切入点。我们应该十分确信 iOS 中的状态栏与 Android 的是完全不同的,iOS 的状态栏属于应用的一部分,而不是系统的一部分,也就是说,iOS 的状态栏极有可能是一个 UIView 或者是一个 UIWindow 叠加在我们自己的 ViewController 之上的。

同时我观察到,当我的 app 一个 ViewController 都没有时,状态栏也会显示,由此可以推断出,状态栏可能是 UIApplication 的一部分。

Hack Step 1.

为了验证这一猜想,我决定使用 Objective-C Runtime 来一探究竟。
首先我列举出了所有 UIApplicationIvar:

结果如下:

果不其然,我发现了 _statusBar 这个 Ivar,当然还有一系列的相关属性。

Hack Step 2.

有了它我们其实就可以尝试通过 KVC 的方式把这个私有属性取出来。

OMG,感觉豁然开朗,这家伙就是个 UIView !直接拿来用啊….

Hack Step 3.

知道了它是个 UIView 其实后续就十分简单了。

回到 Interface Builder,我们拖拽一个空白的 View,将其背景色设为白色,设置一下约束。同时为了方便起见,我给它设置了一个 tag。

然后我们可以利用 layer mask 的方式,让状态栏的 layer 是空白 view 的 mask,这样,状态栏的内容其实就映射到那个空白 view 上了。

OK,立马写下下面一行代码:

马上 ⌘ + R 跑一下:

It’s just gorgeous!!

很简单,就实现了这么炫酷的效果了~当然,不要高兴得太早,这样明睁眼漏的调用 Private API 上架是会被拒的。。至于怎么使用 Private API 且不被拒,自己想想办法吧。Have fun!

1 8 收藏 评论

可能感兴趣的话题



直接登录
跳到底部
返回顶部