在iOS13中,苹果推出了新的暗黑模式,这就帮助我们在黑夜中使用不那么刺眼的应用。这个还是很符合大多数人在夜间玩手机的习惯。既然这样,那我们作为一个合格的开发,当然要及时拥抱变化,早日跟进这个功能。
    DarkMode中有哪些适配方案呢?
1.将两种主题不同的素材直接存储在对象中,UIKit在主题变化时获取对应的素材进行更新展示。(例子:在Assets中设置不同的模式下的颜色和图片)
优点:工作量少,对原代码影响较少,开发省时省力
缺点:灵活性较差,如果是不同图的话会对包的体积有一定影响
2.通过接受主题变化的通知,在通知回调中做相应的适配工作
优点:高度自定义,灵活性强
缺点:代码量相对较多,适配工作量较大

下面分别对两种不同的放进行举例:

第一种方案:

1.1 颜色的处理

1.1.1 使用系统提供的UIKit的颜色(如labelColor、UIColor.secondaryLabelColor等)。这些颜色都内置了适配颜色,会根据不同主题自定切换适配。

      if (@available(iOS 13.0, *)) {
_textLabel.textColor = UIColor.secondaryLabelColor;
}else {
_textLabel.textColor = [UIColor redColor];
}

1.1.2 创建动态颜色

通过对UIColor新增扩展类的方式添加一个方法,在设置时添加lightcolor和darkcolor。

之前还考虑过通过设置宏定义进行自动切换,只要在颜色的宏中修改就行,但是由于xcode没有检测到校验 回报多处警告,影响代码视觉体验,所以改为扩展。

#define kDarkMode @available(iOS 13.0, *) && UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark
#define Color_Background kDarkMode?[UIColor blackColor]:[UIColor whiteColor]

缺点:操作量较大

1.1.3 在assets中添加动态颜色资源





步骤二可以只设置any和dark 也可以设置any、light和dark

// 通过name方式直接取
UIColor *backgroundColor = [UIColor colorNamed:@"backgroundColor"];

1.2 图片的适配

1.2.1 在assets中添加动态图片资源



类似于颜色设置,使用方法还是和之前一样。

1.2.2 创建自己的动态图片

通过对UIImage新增扩展类的方式添加一个方法,在设置时添加lightcolor和darkcolor。类似于动态颜色的设置

1.2.3 网络图片

比如有这么一种场景:我浅色主题和深色主题下显示不同的图片,并且两张图片都不是本地的,都是从网络获取,实现思路大概是:先把两张图片下下来,在本地组装成动态图片

这个不常见,一般来说都是显示同一张图片。我们也可以通过sdwebimage进行设置。下载完图片后进行动态整合。

2.1 UITraitCollection

UITraitCollection是用来处理苹果手机的一些特性的存储和UI相关的配置 比如我修改了某些系统设置,如:改字体大小

+ (UITraitCollection *)traitCollectionWithPreferredContentSizeCategory:(UIContentSizeCategory)preferredContentSizeCategory API_AVAILABLE(ios(10.0));
@property (nonatomic, copy, readonly) UIContentSizeCategory preferredContentSizeCategory API_AVAILABLE(ios(10.0)); // unspecified: UIContentSizeCategoryUnspecified

关于主题模式切换的属性是我们本节关注的重点:

typedef NS_ENUM(NSInteger, UIUserInterfaceStyle) {
UIUserInterfaceStyleUnspecified,
UIUserInterfaceStyleLight,
UIUserInterfaceStyleDark,
} API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos); + (UITraitCollection *)traitCollectionWithUserInterfaceStyle:(UIUserInterfaceStyle)userInterfaceStyle API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos);
@property (nonatomic, readonly) UIUserInterfaceStyle userInterfaceStyle API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos); // unspecified: UIUserInterfaceStyleUnspecified

2.2 通过子类重写traitCollectionDidChange这个方法来监听系统设置的一些属性变化

// 并不是每次系统调用traitCollectionDidChange:方法时,模式都有变化,也有可能是设备进行了旋转也会调用traitCollectionDidChange:方法,所以此时需要判断系统主题模式是否发生了改变,只要颜色发生改变后我们才对主题颜色进行修改。
- (void) traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
[super traitCollectionDidChange:previousTraitCollection]; UITraitCollection *traitCollection = [UITraitCollection currentTraitCollection];// 获取当前的TraitCollection
BOOL hasUserInterfaceStyleChanged = [previousTraitCollection hasDifferentColorAppearanceComparedToTraitCollection:traitCollection];
// 根据当前模式更新视图
}

补充功能:

1.如何全局关闭DarkMode?

1.在Info.plist 文件中,添加 key 为 User Interface Style 类型String。
2.将UIUserInterfaceStyle key 的值设置为 Light

2.如何只是单独几个页面关闭DarkMode?

// 在ios13系统下UIViewcontroller与UIView有一个新的属性 overrideUserInterfaceStyle 可以强制设置关闭暗黑模式的属性
typedef NS_ENUM(NSInteger, UIUserInterfaceStyle) {
UIUserInterfaceStyleUnspecified,
UIUserInterfaceStyleLight,
UIUserInterfaceStyleDark,
} self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

3.系统主题更换之后会调用哪些方法?

在ViewController:
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
- (void)updateViewConstraints
- (void)viewWillLayoutSubviews
- (void)viewDidLayoutSubviews 在View里:
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
- (void)drawRect:(CGRect)rect
- (void)layoutSubviews
- (void)updateConstraints
- (void)tintColorDidChange 在UIPresentationController里:
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
- (void)containerViewWillLayoutSubviews
- (void)containerViewDidLayoutSubviews

4.启动图能根据不同的mode来展示不同的图片吗?

可以,我们可以像普通的图片那样针对深色模式设置另外的一张图片

参考文章:关于iOS13 DarkMode的适配那些事儿iOS13 (五)暗黑模式Dark Mode深色模式适配

【iOS】iOS13新增的暗黑模式(Dark Mode)的更多相关文章

  1. iOS 13DarkMode暗黑模式

    iOS 13系统的iPhone 在设置-->显示与亮度 -->选择深色 即开启暗黑模式 1.暗黑模式关闭 1.1 APP开发未进行暗黑适配,出现顶部通知栏字体颜色无法改变始终为白色.可以全 ...

  2. 网页跟随系统 dark mode (暗黑模式) 的实现

    经过几十年的沉默, dark mode(暗黑模式) 又回到了我们面前,越来越多的 APP 有了暗黑主题,越来月多的操作系统原生添加了 "全局暗黑模式", 那么一个网站如何跟随系统的 ...

  3. 科技感满满,华为云DevCloud推出网页暗黑模式

    近期,华为云DevCloud推出了暗黑模式,让用户在网页端也可以体验到桌面级应用才有的特性.   深色模式(Dark Mode),俗称暗黑模式.是近2年以来用户呼声最高的功能之一,一些国外顶级厂商都将 ...

  4. 利用CSS3自定义属性来为网站添加“暗黑模式”(暗色模式/DarkMode)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_114 究竟什么是暗黑模式?这个概念起初来源于macOS系统,该系统的mojave版本为用户提供两个主题皮肤,即浅色和深色的皮肤.自 ...

  5. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  6. PyCharm:2017.3版即将新增科学计算模式,预览版现在可以下载使用

    编译:Lemon,原文作者:Ernst Haagsman 公众号:Python数据之道(ID:PyDataRoad) pycharm:2017.3版即将新增科学计算模式 在JetBrains将发布的新 ...

  7. ios中safari无痕浏览模式下,localStorage的支持情况

    前言 前阶段,测试提了个bug,在苹果手机中无痕模式下,搜索按钮不好使,无法跳页,同时搜索历史也没有展示(用户搜索历史时使用localStorage存储). 正文 iOS上Sarfari在无痕模式下, ...

  8. Chrome 浏览器的简单设置 无痕模式 暗黑模式 自定义用户目录

    1. Chrome73 新增加了暗黑模式 可以通过修改快捷方式的方式来默认开启方法如下 1.1 关闭浏览器 2.2 鼠标焦点定位到任务栏 Chrome 图标处, 并且按住shift 按键 执行右键操作 ...

  9. runloop是iOS系统上的actor模式

    runloop是iOS系统上的actor模式(单线程派发的)

  10. iOS UI的几种模式

    iOS UI的几种模式: 1.平凡模式(原生控件组合): 2.新闻模式: 3.播放器模式: 4.微博模式:

随机推荐

  1. 精控Spring AI日志

    还在为 Spring AI 默认的日志抓狂吗?想看日志却看不到,一开 DEBUG 就刷屏... 别慌! 今天 NEO 带你解锁一个神级操作:自定义 Advisor,让你轻松掌控 AI 调用的每一个细节 ...

  2. 如何通过命令行wifi上网 linux

    步骤 ifconfig wlan0 up wpa_supplicant -Dnl80211 -iwlan0 -c/wpa1.conf & 在/etc/resolv.conf 中写入 DNS的配 ...

  3. Petalinux ARM设置自启动、自动加载驱动、自动挂载SD卡

    一.在工程路径下新建app petalinux-create -t apps --template install -n myapp-init --enable petalinux会在metausr目 ...

  4. 数据迁移新技能,MongoDB轻松同步至ClickHouse

    在当今数据驱动的世界中,企业的成功依赖于对数据的高效管理和精准分析.数据迁移是实现这些目标的关键环节,而选择合适的工具可以让这项工作变得更加轻松和高效.ETLCloud 是一款创新的 ETL(提取.转 ...

  5. WMS系统与电商平台快速拉通库存数量

    什么是WMS系统 WMS系统是指仓储管理系统(Warehouse Management System).它是一种用于管理和控制仓库运营的软件系统.WMS系统通过集成信息技术,提供仓库内货物的存储.出入 ...

  6. Resume: How to Write a Minimalistic CV in LaTeX: Step-by-step Guide

    How to Write a Minimalistic CV in LaTeX: Step-by-step Guide https://latex-tutorial.com/cv-latex-guid ...

  7. 2024年更新「GIS数据」全国的GeoJSON、shp格式数据下载获取(精确到乡镇街道级)

    发现个可以免费下载全国 geojson 数据的网站,推荐一下.支持全国.省级.市级.区/县级.街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3.Echarts等 geojso ...

  8. unity 单位 像素 分辨率 正交摄像机size 之间的关系

    这个5表示摄像机的视距 代表摄像机拍摄的一般高度 如果16:9的分辨率,100像素为1 unity单位的情况 填充摄像机所需图片大小尺寸为:高度:5*2*100 = 1000    宽度:1000*1 ...

  9. zuul 源码解析

    1. RefreshableRouteLocatorRouteLocator 路由定位器,在 Spring Cloud Zuul 中,RouteLocator 的主要作用是加载 zuul 路由配置信息 ...

  10. Dubbo简介及其与ZooKeeper的关系

    Dubbo简介及其与ZooKeeper的关系 原创 图南 图南随笔 2019-09-21 | Dubbo与ZooKeeper系列文章 ZooKeeper简介及安装 ZooKeeper CLI 详解 D ...