今天遇到了一个 UILabel 的 textColor 自动跟肤的问题, 复现路径是
- 打开出问题页面, 文字显示黑色, 显示正常
- 从手机屏幕右上角下滑, 在屏幕亮度中打开”深色模式”, 回到 app
- 原本显示黑色的 UILabel 就变成了白色
由于业务比较复杂, 我直接用符号断点去看哪个业务做的这个颜色的修改, 诡异的是在 Xcode 打符号断点 -[UILabel setTextColor:]
居然捕获不到这次变色, 说明并不是业务层代码主动去改的颜色.
尝试打印 UILabel.textColor, 结果是 UIDynamicCatalogSystemColor
, 似乎没见过, 估计是 UIColor
的私有子类, 尝试 Google, 没有明显有用的结果, 换 ChatGPT 吧, 结果如下:
UIDynamicCatalogSystemColor
是 iOS 中的一种动态颜色系统,它允许开发者根据用户界面样式的变化而自动调整颜色。这种系统颜色在不同的外观模式下(比如浅色和深色模式)能够自动适应并改变外观,以便更好地适应用户的偏好设置。
而之前打的符号断点也能显示出, UILabel
初始化的时候, 会自动将 textColor
设置成UIDynamicCatalogSystemColor
, 即自动根据系统深色模式调整 textColor
, 后面我们的业务代码由于某些原因再也没有设置过 textColor
, 所以就自动变色导致 bug.
解决办法, UILabel 初始化之后设置默认的 textColor
即可.