iOS 暗黑模式的适配总结

iOS DarkMode Adapter

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

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

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

2.将UIUserInterfaceStyle key 的值设置为 Lightide

这样大家就会看到界面就和以前同样了,可是还有一个很细微的地方要处理,那就是状态栏的样子并不受上面添加的值影响,因此咱们还要对状态栏作适配函数

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

DarkMode 文字的颜色

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

​ 那么咱们就来看看要怎么作到经过切换显示模式自动的切换文字的颜色呢?spa

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

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

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

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

#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.代码默认执行时,就能够正常经过名字使用了,系统会根据当前模式自动获取对应的资源文件

相关文章
相关标签/搜索