上周三下午,我正在星巴克调试新做的健康类App,突然发现状态栏的白色文字和淡紫色背景混在一起,活像杯没搅匀的香芋星冰乐。这时候才意识到,是时候好好研究下状态栏的个性化设置了。

系统自带的换装游戏

苹果其实给开发者留了后门钥匙。打开Xcode就像打开化妆盒,UIStatusBarStyle这个参数就像口红的不同色号。在ViewController里加上这几行代码,界面瞬间变装:

  • override var preferredStatusBarStyle: 控制字体黑白
  • setNeedsStatusBarAppearanceUpdate 实时刷新状态栏
  • 在Info.plist里设置View controller-based status bar appearance决定谁说了算
样式类型适用场景视觉特征
.default深色背景白色文字
.lightContent浅色背景黑色文字
.darkContentiOS13+专属深灰文字

实际开发中的小心机

记得去年做电商App时,商品详情页需要根据图片亮度自动切换状态栏样式。这时候在scrollViewDidScroll里动态计算背景明度,配合preferredStatusBarStyle的实时更新,效果比淘宝还丝滑。

自制状态栏的野路子

有次产品经理非要让状态栏显示自定义的渐变效果,这时候就得自己动手造轮子。新建个UIView贴在window最上层,尺寸设置成20pt高度,记得处理设备旋转时的自动布局:

  • 通过UIApplication.shared.keyWindow?获取顶层窗口
  • 监听UIDevice.orientationDidChangeNotification通知
  • 使用AutoLayout约束保持置顶状态
实现方式优点缺点
系统原生性能样式受限
自定义视图完全自由需要处理系统事件
混合模式平衡灵活度代码复杂度高

那些年踩过的坑

去年情人节特别版App里,我给状态栏加了爱心雨动画。结果测试时发现,微信分享完返回App,自定义状态栏神秘消失了。最后发现是keyWindow发生了变化,改成遍历window数组才解决。

与SwiftUI的磨合期

自从项目改用SwiftUI后,状态栏定制变得更像在玩解谜游戏。在SceneDelegate里配置UIHostingController时,要特别注意这几点:

  • 继承UIHostingController重写状态栏属性
  • SceneDelegate中替换默认的HostingController
  • 使用.preferredColorScheme修饰符控制深色模式

窗外的天色渐渐暗下来,MacBook的电量显示变成黄色提醒。我顺手在模拟器上测试完深色模式适配,看着完美融入界面的状态栏,感觉今天的咖啡钱花得真值。