暗黑模式

原理

将同一个资源,创建出两种模式的样式。系统根据当前选择的样式,自动获取该样式的资源
每次系统更新样式时,应用会调用当前所有存在的元素调用对应的一些重新方法,进行重绘视图,可以在对应的方法做相应的改动
资源文件适配

创建一个Assets文件(或在现有的Assets文件中)
新建一个图片资源文件(或者颜色资源文件、或者其他资源文件)
选中该资源文件, 打开 Xcode ->View ->Inspectors ->Show Attributes Inspectors (或者Option+Command+4)视图,将Apperances 选项 改为Any,Dark
执行完第三步,资源文件将会有多个容器框,分别为 Any Apperance 和 Dark Apperance. Any Apperance 应用于默认情况(Unspecified)与高亮情况(Light), Dark Apperance 应用于暗黑模式(Dark)
代码默认执行时,就可以正常通过名字使用了,系统会根据当前模式自动获取对应的资源文件
注意

同一工程内多个Assets文件在打包后,就会生成一个Assets.car 文件,所以要保证Assets内资源文件的名字不能相同

如何在代码里进行适配颜色(UIColor)

  1. + (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
  2. - (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
  3. [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trait) {
  4. if (trait.userInterfaceStyle == UIUserInterfaceStyleDark) {
  5. return UIColorRGB(0x000000);
  6. } else {
  7. return UIColorRGB(0xFFFFFF);
  8. }
  9. }];

系统调用更新方法,自定义重绘视图

当用户更改外观时,系统会通知所有window与View需要更新样式,在此过程中iOS会触发以下方法, 完整的触发方法文档

UIView
traitCollectionDidChange(:)
layoutSubviews()
draw(
:)
updateConstraints()
tintColorDidChange()
UIViewController traitCollectionDidChange(:)
updateViewConstraints()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
UIPresentationController
traitCollectionDidChange(
:)
containerViewWillLayoutSubviews()
containerViewDidLayoutSubviews()
如何不进行系统切换样式的适配

  1. 注意
  2. 苹果官方强烈建议适配 暗黑模式(Dark Mode)此功能也是为了开发者能慢慢将应用适配暗黑模式
  3. 所以想通过此功能不进行适配暗黑模式,预计将会被拒
  4. 全局关闭暗黑模式
  5. Info.plist 文件中,添加UIUserInterfaceStyle key 名字为 User Interface Style 值为String
  6. UIUserInterfaceStyle key 的值设置为 Light
  7. 单个界面不遵循暗黑模式
  8. UIViewControllerUIView 都新增一个属性 overrideUserInterfaceStyle
  9. overrideUserInterfaceStyle 设置为对应的模式,则强制限制该元素与其子元素以设置的模式进行展示,不跟随系统模式改变进行改变
  10. 设置 ViewController 的该属性, 将会影响视图控制器的视图和子视图控制器采用该样式
  11. 设置 View 的该属性, 将会影响视图及其所有子视图采用该样式
  12. 设置 Window 的该属性, 将会影响窗口中的所有内容都采用样式,包括根视图控制器和在该窗口中显示内容的所有演示控制器(UIPresentationController

更多相关文章

  1. Android的设计模式
  2. iOS13适配的实现方法
  3. iOS实现文本分页的方法示例
  4. Android代码实现飞行模式的打开
  5. 移动端布局思路与三种视口的关系 ,仿淘宝首页基本布局
  6. Android中的资源与国际化
  7. Android最新支持包Design简介
  8. 初探Android(安卓)Scroll——scrollTo()与scrollBy()
  9. PHP设计模式之命令模式示例详解

随机推荐

  1. 2020年出生人口会大跌吗?解读人口数据
  2. ssh 创建多个秘钥对,连接不同的服务器
  3. centos 7 scp命令的使用
  4. 强势回归!再说回归分析
  5. 数据会说谎的真实例子有哪些
  6. 火爆全网的条形竞赛图,原来做起来这么简单
  7. Python爬虫-selenium
  8. 全网最新最良心的IDEA安装教程
  9. Python数据可视化:2018年北上广深空气质量
  10. IBM 3650M3安装CentOS7.2