前言 笔者最近了解了DarkMode相关的颜色、图片、Web的适配,而且作了一个Demo QiDarkMode,给你们分享一下相关内容。css
在iOS 13.0及更高版本中,人们能够选择采用深色系统范围的外观,称为暗模式。Dark Mode(暗模式)是苹果在iOS13推出的新特性。使用iOS13及更高版本的系统的iOS 设备,可使用暗模式,在暗模式下,系统会采用较暗的视图控件。开发者在开发过程当中须要对视图控件进行相应暗模式的适配。html
笔者分别作了Dark Mode Color、Image、Web的适配示例,分别录制了以下效果图。前端
Environment Overrides
,选择Interface Style的 Light 或 Dark能够切换亮/暗模式。首先咱们在适配Dark Mode的时候,使用相关API须要先写明。ios
if (@available(iOS 13.0, *)) {
// Dark Mode适配相关代码
}
复制代码
上述API写法较长,笔者写了以下一个宏,便于你们使用。使用方式为:QiAvailable(13.0)。git
#define QiAvailable(version) @available(iOS version, *)
复制代码
苹果官方为开发者提供了一些系统色,咱们能够利用结合着文档提示及在Storyboard中测试,选择要填充的背景色。测试选择要使用的文字颜色。github
开发过程当中会须要设置图片或者颜色的Dark、Light、Any模式下的样式。web
Xcode默认的图片和颜色的样式都为None,点击右侧属性中的Appearances能够切换样式为Any,Dark 或 Any,Light,Dark。微信
相关内容会在下文的中Color Asset部分有所体现。app
通常咱们能够在基类控制器中写明视图背景色,或基类视图中写明背景色。
如:
self.view.backgroundColor = [UIColor systemBackgroundColor];
textField.textColor = [UIColor placeholderTextColor];
label.backgroundColor = [UIColor tertiarySystemBackgroundColor];
复制代码
若是咱们须要灵活设置视图背景色或文字颜色,可使用苹果提供的:
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
复制代码
如:
if (QiAvailable(13.0)) {
self.view.backgroundColor = [UIColor systemBackgroundColor];
// 等价于
// 能够在Dark 和 Light 模式下设置所需的颜色 如Dark下某个接近黑色的颜色 Light下某个接近白色的颜色
self.view.backgroundColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight) {
return [UIColor whiteColor];
} else if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
return [UIColor blackColor];
}
return [UIColor whiteColor];
}];
}
复制代码
label.textColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
return [UIColor lightTextColor];
} else {
return [UIColor darkTextColor];
}
}];
复制代码
添加Color Asset的方式以下图所示:
能够选择Color Asset 对应的Dark,Light,Any;及Dark,Any 模式下,要显示的颜色。
使用咱们建立的Color Asset的方式为:
[UIColor colorNamed:@"StarColor"];
复制代码
+ (**nullable** UIColor *)colorNamed:(NSString *)name API_AVAILABLE(ios(11.0));
这个API适用于iOS11及更高版本。
听同事CY说,这个API显示的颜色在iOS11.x的系统上会出现问题,可是苹果在Xcode11正式版已经解决了相关问题。
其中StartColor的配置以下:笔者这里的处理方式为:添加Color Asset,设置Appearance 为Any,Dark。代表笔者只关注Dark模式和非Dark模式,而且设置了非Dark模式显示为蓝色,Dark模式显示为紫色。
// Asset中设置多张图片
UIImage *logoImage = [UIImage imageNamed:@"QiShare"];
UIImageView *logoImageView = [[UIImageView alloc] initWithImage:logoImage];
logoImageView.frame = CGRectMake(120.0, 100.0, logoImage.size.width, logoImage.size.height);
[self.view addSubview:logoImageView];
复制代码
设置多模式下图片的方式以下:选中图片-> 切换Appearance -> 把想要展现的图片拖入到对应模式下。
若是咱们的图片资源是加载的bundle中的图片。那么能够以下接口中监听模式变化,而且作相应的图片的更新的操做。
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection API_AVAILABLE(ios(8.0));
复制代码
@property (nonatomic, strong) UIImageView *logoImageView;
@property (nonatomic, strong) UIImage *lightLogoImage;
@property (nonatomic, strong) UIImage *darkLogoImage;
复制代码
self.darkLogoImage = [self qi_imageWithNamed:@"flutterLogo"];
self.lightLogoImage = [self qi_imageWithNamed:@"QiShare"];
UIImage *logoImg =self.lightLogoImage;
UIImageView *logoImgV = [[UIImageView alloc] initWithImage:logoImg];
self.logoImageView = logoImgV;
[self.view addSubview:logoImgV];
logoImgV.frame = CGRectMake(100.0, 100.0, logoImg.size.width, logoImg.size.height);
复制代码
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if (QiAvailable(13.0)) {
if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
self.logoImageView.image =
self.darkLogoImage;
} else {
self.logoImageView.image =
self.lightLogoImage;
}
}
}
}
复制代码
不一样模式下控制图片显示相应tintColor。
// tintColor 改变Image着色
UIImage *starImage = [UIImage imageNamed:@"star"];
starImage = [starImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *starImageView = [[UIImageView alloc] initWithImage:starImage];
starImageView.frame = CGRectMake(100.0, 220.0, starImage.size.width, starImage.size.height);
starImageView.tintColor = [UIColor colorNamed:@"StarColor"];
[self.view addSubview:starImageView];
复制代码
注意+ (**nullable** UIColor *)colorNamed:(NSString *)name API_AVAILABLE(ios(11.0));
这个API 是从iOS11.0开始支持的。
设置tintColor生效的一个注意点:
// UIImageRenderingModeAlwaysTemplate:Always draw the image as a template image, ignoring its color information
// 忽略图片的颜色信息 把图片做为模板图片来绘制
// 图片的显示颜色由tintColor控制
复制代码
在macOS10.14 Mojave系统中支持Dark Mode,切换暗模式和亮模式的方式为:系统偏好设置 -> 通用->外观 -> 浅色/深色。
下边的内容是笔者参考Dark Mode Support in WebKit:写的一个简单H5文件,你们有须要的话,能够提供给前端同窗查看。相关内容,笔者也已经在Demo中使用本地加载的方式测试过,能够在不一样模式下,正常切换。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Qi测试DarkMode</title>
<style> :root { color-scheme: light dark; --special-text-color: black; --bg-color: white; } @media (prefers-color-scheme: dark) { :root { --special-text-color: white; --bg-color: black; } } .special { color: var(--special-text-color); background-color: var(--bg-color); } body { background-color:var(--bg-color); } h1 { color:var(--special-text-color); text-align:center; } p { color:var(--special-text-color); font-family:"Times New Roman"; font-size:20px; } </style>
</head>
<body>
<h1>测试DarkMode标题</h1>
<p>DarkMode段落。</p>
<picture>
<source srcset="http://img.zcool.cn/community/012b62554b2b0e000001bf72f9aad7.jpg@2o.jpg" media="(prefers-color-scheme: dark)">
<img src="http://p0.so.qhmsg.com/t0184f2659879a11464.jpg", width="300">
</picture>
</body>
</html>
复制代码
详情见Demo:QiDarkMode
小编微信:可加并拉入《QiShare技术交流群》。
关注咱们的途径有:
QiShare(简书)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公众号)
推荐文章:
2019苹果秋季新品发布会速览
申请苹果开发者帐号的流程
Swift 5.1 (3) - 字符串
用Flutter 写一个简单页面
5分钟,带你迅速上手Markdown语法
Swift 5.1 (2) - 运算符
Swift 5.1(1) - 基础
Sign In With Apple(一)
奇舞周刊