iOS 暗黑模式的适配总结

简介: iOS 暗黑模式的适配总结

iOS DarkMode Adapter

​ 就在上个月,国内的自媒体就开始疯传苹果要求开发者适配暗黑模式,并且还有谣言说,苹果通知微信强制适配暗黑模式,第二天微信的官方团队就宣布暗黑模式已经适配并且在下一个版本中就可以见到了。果然没有过多久就真的体验到了广大群众千呼万唤的暗黑模式,但是作为一个iOS使用者,我并没有觉得微信的暗黑模式有多好用,甚至觉得有的时候还会给我带来一些麻烦,最好能在微信中做一个开关,让用户自己选择显示 什么模式。但是后来一想,如果这样做了那是不是就和好几年前很流行的那种主题功能很类似了......感觉在鬼打墙.......

我作为一个低端的iOS开发者,当iOS13 出来时候,我们第一时间也没有选择适配,我们选择的是一种简单快捷的方案,全局关闭暗黑模式。只要做如下操作:

1.在Info.plist 文件中,添加UIUserInterfaceStyle key 名字为 User Interface Style 值为String,

2.将UIUserInterfaceStyle key 的值设置为 Light

这样你们就会看到界面就和之前一样了,但是还有一个很细微的地方要处理,那就是状态栏的样子并不受上面添加的值影响,所以我们还要对状态栏做适配

if (@available(iOS 13.0, *)) {
    [UIApplication sharedApplication].statusBarStyle =UIStatusBarStyleDarkContent;  }else{
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}

DarkMode 文字的颜色

​ 在测试的时候我发现,但我们用UILabel显示文字的时候,只要不去设置颜色,系统会自动的通过现实的模式自动的调节颜色。但是在实际的开发中,我们并不可能一直都用一个颜色,而且 也不可能都是和白色的。

​ 那么我们就来看看要怎么做到通过切换显示模式自动的切换文字的颜色呢?

​ 当你想到这个问题的时候,苹果都已经帮你解决了。在iOS13的SDK中哟这么一个函数

+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

​ 这是一个动态颜色的设置,那么我们只要写一个UIColor的Category 就好了,统计一下我们的项目中都用到了什么样的颜色,这个时候也要UI设计师给你设计一下在暗黑模式下,各个文字对应的颜色是什么。这样我们就可以完成了对文字颜色的适配,其实后来我发现 不只是文字,只要是涉及到颜色的地方都可以这么处理。

​ 下面是我简单的写了几个颜色,仅供参考:

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIColor (DarkMode)

+ (UIColor *)textColor;

+ (UIColor *)viewControllerBackGroundColor;

@end

NS_ASSUME_NONNULL_END

#import "UIColor+DarkMode.h"

@implementation UIColor (DarkMode)
+ (UIColor *)colorWithHex:(UInt32)hex andAlpha:(CGFloat)alpha {
    int r = (hex >> 16) & 0xFF;
    int g = (hex >> 8) & 0xFF;
    int b = (hex)&0xFF;

    return [UIColor colorWithRed:r / 255.0f green:g / 255.0f blue:b / 255.0f alpha:alpha];
}
+ (UIColor *)textColor{
    if (@available(iOS 13.0, *)) {
          return [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trait) {
             if (trait.userInterfaceStyle == UIUserInterfaceStyleDark) {
                 return [UIColor whiteColor];
             } else {
                 return [UIColor blackColor];
             }
          }];;
      }else{
         return [UIColor blackColor];
      }
}

+ (UIColor *)viewControllerBackGroundColor{
    if (@available(iOS 13.0, *)) {
          return [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trait) {
             if (trait.userInterfaceStyle == UIUserInterfaceStyleDark) {
                 return [UIColor blackColor];
             } else {
                 return [UIColor whiteColor];
             }
          }];;
      }else{
         return [UIColor whiteColor];
      }
}
@end

DarkMode Image Assets

上面说完了颜色的适配,下面就要来说一下还有图片的适配:

1.创建一个Assets文件(或在现有的Assets文件中)

2.新建一个图片资源文件(或者颜色资源文件、或者其他资源文件)

3.选中该资源文件, 打开 Xcode ->View ->Inspectors ->Show Attributes Inspectors (或者Option+Command+4)视图,将Apperances 选项 改为Any,Dark

4.执行完第三步,资源文件将会有多个容器框,分别为 Any ApperanceDark Apperance. Any Apperance 应用于默认情况(Unspecified)与高亮情况(Light), Dark Apperance 应用于暗黑模式(Dark)

5.代码默认执行时,就可以正常通过名字使用了,系统会根据当前模式自动获取对应的资源文件

相关文章
|
9天前
|
调度 iOS开发 开发者
iOS 中的并发编程模式:理解 GCD 和 Operation Queues
【4月更文挑战第19天】 在现代 iOS 应用开发中,有效地管理线程和并发是至关重要的。为了确保用户界面的流畅性和后台任务的高效运行,开发者需要掌握并发编程技术。本文深入探讨了两种主要的并发模式:Grand Central Dispatch (GCD) 和 Operation Queues。我们将分析它们的工作原理,比较它们的特点,并通过实际代码示例说明如何在 iOS 应用中实现高效的并发处理。通过本文,读者将获得在 iOS 平台上进行多线程开发的实用知识,以及如何根据不同的应用场景选择最合适的并发工具。
|
5月前
|
小程序 开发工具 Android开发
Donut多端框架小程序打包适配ios和安卓app
腾讯新出了一个 Donut 多端框架,可以直接将微信小程序转成 ios 和 安卓 app,小程序开发者工具里也集成了 app 相关升级、调试和打包的功能,终于可以一套代码开发出3个客户端了!
129 0
Donut多端框架小程序打包适配ios和安卓app
|
7月前
|
小程序 iOS开发
uniapp中IOS端小程序底部黑线适配的方法(整理)
uniapp中IOS端小程序底部黑线适配的方法(整理)
|
iOS开发
IOS 黑暗模式简单理解
IOS 黑暗模式简单理解
72 0
|
iOS开发
IOS - iPhoneX 怎么进入 DFU 模式(刷机必备)?
IOS - iPhoneX 怎么进入 DFU 模式(刷机必备)?
983 0
|
iOS开发 Perl
iOS 屏幕比例适配
iOS 屏幕比例适配
|
iOS开发
iOS - 用Masonry封装的slider,完全支持Masonry的适配
iOS - 用Masonry封装的slider,完全支持Masonry的适配
99 0
|
安全 iOS开发
iOS小技能:下拉刷新控件的适配
1. 下拉顶部背景色设置: 往tableView的父控件添加拉伸背景视图 2. present 半屏适配 iOS13 modalPresentationStyle属性默认不是全屏样式`UIModalPresentationFullScreen`,而是半屏样式,需要根据需求手动设置。 present 半屏,会导致列表下拉刷新失效。
159 0
iOS小技能:下拉刷新控件的适配
|
Web App开发 移动开发 前端开发
HTML5 移动端页面适配 iOS 系统刘海屏
HTML5 移动端页面适配 iOS 系统刘海屏
1071 0
HTML5 移动端页面适配 iOS 系统刘海屏
|
Web App开发 API iOS开发
WebKit 代码“曝露”苹果 Safari 新功能:iOS 15/16 或添自定义暗黑模式、弹窗等设置
WebKit 代码“曝露”苹果 Safari 新功能:iOS 15/16 或添自定义暗黑模式、弹窗等设置
205 0
WebKit 代码“曝露”苹果 Safari 新功能:iOS 15/16 或添自定义暗黑模式、弹窗等设置