iOS 深色模式适配
要求:iOS13.0以上
重点:需要所有界面进行适配,工作量巨大,需要从项目开始就进行适配;H5界面无法进行适配
实现方式:System Colors(常用)、Semantic Colors(常用)、Dynamic Colors(常用)、Asset Catalog、Border colors、Dynamic Images
1.System Colors:
Apple为了适配深色模式对UIKit中的UIColor进行了重新定义,具体颜色代码值可查看apple官方文档,例如将.red, .blue和 .yellow定义为.systemRed,.systemBlue和.systemYellow,这些新定义的System Colors在深色和浅色模式下表现为不同的颜色。
2.Semantic Colors:
对于一些需要进行文字显示的控件apple也做了深色模式的适配,Apple新加了Semantic Colors颜色方案,使用Semantic Colors时不需要纠结具体的值,只需要在合适的场景使用,例如当控件是Label时,在没有自定义字体颜色时,可以使用.label类型的的Semantic Colors,在浅色模式下显示黑色字体,在深色模式下显示白色字体;Semantic Colors包括.label,.separator,.link, .systemBackground和.systemFill。
3.Dynamic Colors(自定义颜色):
在实际开发中很多情况下我们都是需要自定义颜色的,Apple也给出了相应的方案,那就是通过UIColor.init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)这个方法进行创建自定义的semantic color。
为系统类UIColor写一个扩展
public extension UIColor {
static func | (lightMode: UIColor, darkMode: UIColor) -> UIColor {
guard #available(iOS 13.0, *) else { return lightMode }
return UIColor { (traitCollection) -> UIColor in
return traitCollection.userInterfaceStyle == .light ? lightMode : darkMode
}
}
}
4.Asset Catalog:
在asset里面预先保存自定义颜色,在Any Appearence(浅色模式)和Dark Appearence(深色模式)分别添加一种颜色即可。一般用于高度重复的颜色,比如主题色等,需要UI高度统一颜色标准。
支持代码使用:view.backdroundcolor = Color(named: “自定义颜色名”)
5.Border colors:
Border colors在当主题模式发生改变时并不会自动的进行适配,所以需要手动的进行处理,可以通过traitCollectionDidChange(_:)这个方法在进行处理:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
traitCollection.hasDifferentColorAppearance(comparedTo: traitCollection) {
layer.backgroundColor = UIColor.layer.cgColor
}
}
6.Dynamic Images:
图片资源同样支持深色模式,需要使用Assets.xcassets,新建一个Assets.xcassets并在Attributes inspector点击Appearances选择Any, Dark,然后分别为Any Appearances和Dark Appearances配置响应的图片。
后台返回图片时需要自己用代码创建Assets。
尽量不要使用图片,无限的增加图片资源最终会导致包的大小会增加很多。
可以tintColor或者反转图片颜色解决改变图片颜色问题
iOS 深色模式适配的更多相关文章
- Android QMUI实战:实现APP换肤功能,并自动适配手机深色模式
Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案. 之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因: 1.换肤功能的实现过程较简单.容易理解: 2.能轻松适配 ...
- 关于IOS的屏幕适配(iPhone)——资源适配
IOS的屏幕适配几乎不需要大量的代码操作,更多的时间我们只是动动鼠标选择一下就搞定.可以苹果在这方面做的还是比较人性的,解放了开发者. 首先来说说Iphone这几种屏(由于最近做的是iPhone AP ...
- iOS 架构模式-MVVM
iOS 架构模式-MVVM MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创 ...
- QF——iOS代理模式
iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...
- 「技巧」如何将Sketch改为深色模式
之前Sketch只能根据mac系统的外观设置变更皮肤.在更新了版本54之后,可以脱离操作系统,在自己的偏好设置中更改外观了. 准备 Sketch 54 更多工具:whose.design 第一步:打开 ...
- 【深色模式】macOS Mojave+Visual Studio for Mac+FineUICore多图赏析!
全面开启深色模式,今早成功升级到 macOS Mojave,下面就来欣赏一下吧. 点击图片,查看大图 1. 下载 macOS Mojave 2. 安装成功,开启深色模式 3. 来一张桌面截图 4. 开 ...
- Mac上深色模式下的精美炫酷软件
针对发布的 macOS Mojave 10.14 系统中,最大的改变就是引入了深色模式,尤其对技术开发人员来说非常实用,非常的酷! 深色模式使用一种较深的配色方案,这种配色作用于整个系统,包括 Mac ...
- iOS 6 & iOS 7 的适配笔记
iOS 6 & iOS 7 的适配 场景1: 没有NavigationController,同时根视图是UIView- (void)viewWillLayoutSubviews{ if ([[ ...
- macOS Mojave 深色模式
macOS Mojave 深色模式 mac 关闭 深色模式 https://support.apple.com/zh-cn/HT208976 https://www.apple.com/cn/maco ...
- iOS代理模式
iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. ( ...
随机推荐
- token能放在cookie中吗
能. token一般是用来判断用户是否登录的, 它内部包含的信息有: uid(用户唯一的身份标识). time(当前时间的时间戳). sign(签名,token 的前几位以哈希算法压缩成的一定长度的十 ...
- c++ thread, 模板类,锁的调用实例
#include<thread> #include<condition_variable> #include<mutex> #include<queue> ...
- JS通用公共函数
function formatTime(time) { if (typeof time !== 'number' || time < 0) { return time } var hour = ...
- Transformer_Detection-(DETR) 引入视觉领域的首创DETR (ECCV2020)
End-to-End Object Detection with Transformers paper: https://link.zhihu.com/?target=https%3A//arxiv. ...
- python3GUI--打造一款音乐播放器By:PyQt5(附下载地址)
@ 目录 一.准备工作 1.PyQt5 2.qtawesome 二.预览 1.启动 2.歌曲搜索 3.歌曲播放 4.评论查看 5.自定义背景 6.设置-基本设置 7.设置-高级设置 8.定时任务 三. ...
- Monterey 12.3 I225-V有线网卡导致死机或无法使用问题
问题:升级Monterey12.3后启动到桌面死机 解决方法: 1.关闭/去掉所有有线网卡驱动.补丁.网卡设备ID注入: 2.启动命令中加入:dk.e1000=0: 3.启动不死机后,进入网络设置,手 ...
- 匿名Lambda函数,C++
1 // To Compile and Run: g++ -std=c++11 lambda.cc -Wall -O3 && ./a.out 2 3 4 #include <io ...
- 解决VSCode无法显示Unity代码提示和源代码
1,先删除项目目录下的配置文件,也可以理解为除文件夹外的其他文件 2,先把vscode选中,下拉框中没有vscode的找到文件就可以导进来再选中.然后红框里的不要勾选,因为我是这么做的,你也可以试着勾 ...
- 微信内置浏览器的JsAPI(WeixinJSBridge)
参考: https://www.baidufe.com/item/f07a3be0b23b4c9606bb.html https://github.com/zxlie/WeixinApi
- 4、jmeter的断言技术
断言:从反馈的结果来个需求匹配,是不是想要的内容 注:断言必要的时候才用 用过了会影响速度 1.操作步骤: 去选择自己想要响应的文本或者代码或者信息等等..... 2.断言相应大小的字节 3.断言响 ...