iOS 暗黑模式适配

2023-03-29  本文已影响0人  使徒行者24

一、暗黑模式的原理

1.将原本的资源文件,创建出两种不同的模式。根据不同的模式,自动获取该样式的资源。
2.每次切换系统模式的时候,系统会重新调用一些方法,重新赋值。

二、暗黑模式适配主要考虑的是:

1.图片适配
2.颜色适配(文字颜色,背景颜色)
3.状态栏适配
4.关闭暗⿊模式(或者关闭某⼀个页⾯的暗⿊模式
5.模式切换代理

三、如果不需要适配暗黑模式的话去info里面关闭即可。

406592B4-93DD-4EFF-8644-5B814AD122DA.png

四、系统颜色

iOS13之前 UIColor 只能代表⼀种颜⾊,但是在iOS13之后,系统提供了⼀些 UIColor 的颜⾊是动态的,可以在 Light Mode 和 Dark Mode 下显⽰不同的颜色。在这⾥不多讲,因为真是开发中,⽂字颜⾊或者背景颜⾊都是UI设计好的,不太可能会⽤到系统的。
系统提供的动态颜色有: labelColor、systemBackgroundColor、secondarySystemBackgroundColor、tertiarySystemBackgroundColor、systemGroupedBackgroundColor、secondarySystemGroupedBackgroundColor、tertiarySystemGroupedBackgroundColor等。

五、颜色适配

1、iOS13苹果提供了两个专⽤的⽅法

+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
#import "UIColor+DarkAndLightColor.h"
@implementation UIColor (DarkAndLightColor)
+ (UIColor *)colorWithLight:(UIColor *)lightColor dark:(UIColor *)darkColor {
    if (@available( iOS 13.0, *)) {
        return [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
            if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
                return darkColor;
            } else {
                return lightColor;
            }
        }];
    } else {
        return lightColor;
    }
}
@end

2、可以在 Assets.xcassets 文件中使用使用 ColorSet 直接动态设置不同模式下的颜色。

六、图片适配 (使用ImageSet)

1.打开Assets.xcassets
2.新建一个Image set 选择右边栏的Appearances中对应的选项适配深色模式。


image.png

使用方法:[UIImage imageNamed:@“sousuo”];
当模式变化时,UIImage会动态的获取对应模式下的图片资源。

七、单个界面不遵循暗黑模式

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = @"SecondViewController";
    
    self.view.backgroundColor = [UIColor systemBackgroundColor];
    //设置当前控制器不遵循暗黑模式
    if (@available( iOS 13.0, *)) {
        self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    } else {
        NSLog(@"版本低于 iOS 13.0 ");
    }
}
//需要监听系统暗黑模式切换的,看如下代理
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    if (@available(iOS 13.0, *)) {
        if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
            NSLog(@"当前界面处于暗黑模式");
        } else {
            NSLog(@"当前模式处于Light模式");
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读