irpas技术客

iOS 13.0 暗黑模式的适配_same_life_ios 暗黑模式适配

网络 1603

一、暗黑模式的原理 将原本的资源文件,创建出两种不同的模式。根据不同的模式,自动获取该样式的资源。每次切换系统模式的时候,系统会重新调用一些方法,重新赋值。 二、暗黑模式适配主要考虑的是:

1、 图片适配

2、颜色适配(文字颜色,背景颜色)

3、状态栏适配

4、关闭暗?模式(或者关闭某?个页?的暗?模式)

5、模式切换代理

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

四、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); 一个是类方法,一个是对象方法。这两个方法需要传入一个 block,当系统切换模式的时候,会触发回调。这个 block 会返回一个 UITraitCollection 类型的对象,通过其属性 userInterfaceStyle,可以得到当前是 LightMode 还是 DarkMode。就可以在不同的模式下设置想要的颜色。具体用法:创建一个 UIColor 的分类,调用 colorWithDynamicProvider:方法,判断 UITraitCollection 对象的 userInterfaceStyle 属性,根据响应的模式配置颜色。 #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 直接动态设置不同模式下的颜色。

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

使用方法: self.view.backgroundColor = [UIColor colorNamed:@“testColor”];当模式发生变化时,UIColor会动态的获取对应模式下的颜色。 六 图片适配 (使用ImageSet) 打开Assets.xcassets新建一个Image set 选择右边栏的Appearances中对应的选项适配深色模式。

使用方法:[UIImage imageNamed:@“sousuo”];当模式变化时,UIImage会动态的获取对应模式下的图片资源。 七、单个界面不遵循暗黑模式 UIViewController与UIView 都新增一个属性 overrideUserInterfaceStyle。将 overrideUserInterfaceStyle 设置为对应的模式,则强制限制该元素与其子元素以设置的模式进行展示,不跟随系统模式改变进行改变。设置 ViewController 的该属性, 将会影响视图控制器的视图和子视图控制器采用该样式。设置 View 的该属性, 将会影响视图及其所有子视图采用该样式。设置 Window 的该属性, 将会影响窗口中的所有内容都采用样式,包括根视图控制器和在该窗口中显示内容的所有演示控制器(UIPresentationController)。 - (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模式"); } } }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #iOS #暗黑模式适配 #1