iOS暗黑模式(Dark Mode)适配之WKWebview与轮播图(网络图片)

0、前言

随着iOS13的普及,大多数的APP都已经适配了暗黑模式,网络上关于暗黑模式适配的文章也很多,基本看几篇就能解决掉iOS13暗黑模式的适配。我看了大部分的文章,基本都是对暗黑模式通用的介绍和适配,一些实际项目中的具体细节却很少提及,所以此篇文章算是对于其他暗黑模式适配的补充,力求能做到完美适配暗黑模式。PS:如果你没看过其他的暗黑模式适配文章,那么你在看此文章前需要先去看一下其他关于暗黑模式适配的文章,此文章默认你是已经知道暗黑模式需要怎么适配了的。

1、LaunchScreen.storyboard

某些APP虽然适配了暗黑模式,但是对于启动页却没有进行适配。试想一下,当你使用暗黑模式在晚上打开APP的时候,本来其他的都是深色的突然被启动页的白色背景图片或者亮色背景闪了几下,眼睛会不会觉得难受。所以,建议大家如果你们的APP是亮色背景的话,那么建议你适配暗黑模式的时候也要考虑一下对启动图进行适配。为什么我在这里不说launchImage呢,因为根据苹果的规定,2020年4月份的时候所有的APP必须使用LaunchScreen才能提交APP,所以,现在适配的时候尽快替换成LaunchScreen。LaunchScreen适配暗黑模式也挺简单的,只需要点击下面的模式进行切换就能行。


暗黑模式切换

需要注意的是:当你由launchImage换成LaunchScreen以后,或者是已经适配了暗黑模式但是就是看不到效果的时候,这是正常的,因为启动图被缓存了,这时候卸载APP在试试,如果还是不行,那么多卸载几次试试,或者换台手机试试,一定要相信自己。我在适配这个的时候就出现了一直不行,然后我以为是不能这样适配,后面用另外一台没有安装过APP的手机就可以显示出来。PS:我没有试过在Assets里面弄暗黑模式的和正常模式的图片,然后在LaunchScreen放一张图片的方式,因为我开始这样弄,但是由于缓存的原因一直没出来,我以为这样不行,所以换成点击下面的style设置去了。大家可以试试直接像其他图片适配一样进行适配可不可行。

2、WKWebview适配

现在大部分需要注册登录的APP都有一个隐私协议,而这个网页通常是使用WKWebview进行加载的(说到这里在提醒大家一下:webview也被废弃了,所以大家快转换到WKWebview上来)。这时候如果大家能叫前端帮忙适配,那肯定非常省事了。但是如果需要自己进行适配,那么也是可以的。核心就是通过JS代码去动态的修改HTML的背景色。先上代码在进行解释:

#import "ViewController.h"
#import <WebKit/WebKit.h>
@interface ViewController ()<WKNavigationDelegate>
@property (nonatomic, strong) WKWebView *webView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self loadHtmlWithWKView];
}

-(void)loadHtmlWithWKView{
    WKWebViewConfiguration *wkWebconfigura = [[WKWebViewConfiguration alloc]init];
    WKWebView *wkView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:wkWebconfigura];
    [wkView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://juejin.im/welcome/ios"]]];
    wkView.navigationDelegate = self;
    self.webView = wkView;
    [self.view addSubview:wkView];
    self.webView.hidden = YES;
}
//navigationDelegate 当网页加载完毕后会调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    NSString *backgroundColor = @"";
    NSString *labelColor = @"";
    if (@available(iOS 13.0, *)) {
        if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
            backgroundColor = @"\"#001A1A\"";
            labelColor = @"'#FF0000'";
        }else{
            backgroundColor = @"\"#FFFFFF\"";
            labelColor = @"'#666666'";
        }
    } else {
        self.webView.hidden = NO;
        return;
    }
    //写入JS代码
    [self.webView evaluateJavaScript:[NSString stringWithFormat:@"document.body.style.backgroundColor=%@",backgroundColor] completionHandler:nil];
    [self.webView evaluateJavaScript:[NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextFillColor=%@",labelColor] completionHandler:nil];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.webView.hidden = NO;
    });
    
}

@end

核心思想就是通过JS代码去动态的修改网页的背景颜色和文字颜色。在webView:(WKWebView *)webView didFinishNavigation的时候进行当前模式的判断,在通过JS代码进行修改网页的颜色。有人可能会问,为什么不用WKUserScript去进行设置了,我试过了,不起作用。用下面的同一句代码进行设置,没有任何反应,我以为是因为后加载的网页覆盖掉了之前设置的背景颜色,说以在开始的JS代码里面加入了!important,结果也是不行的。为什么先对webView进行隐藏呢,这是因为我的APP隐私协议的背景颜色默认就是白色的,所以加载的时候会先显示白色,然后马上闪到我设置的颜色,对于用户来说,体验不是很好,所以先进行隐藏,而进行0.5s的延时在显示是因为那时候还没设置完,所以有时候会出现没改过来,或者是也会出现闪现的情况。下面看下效果:


修改效果

修改成功,但是由于示例的li也是有背景颜色的,而我们修改的是body的背景,所以会有白色的cell。可以看到勾选swift/flutter的背景就是我们设置的背景,而我们的隐私协议一般都是P标签组成的,所以如果你的隐私协议修改body的背景不成功的话可以具体针对你的具体需求进行修改。

3轮播图(网络图片)的适配

对于图片的适配,大多数的做法是准备两张图片,一张是暗黑模式的,一张是正常模式的。但是对于网络上(公司服务器)拿到的轮播图或者网络图片,这些要用两张的话个人觉得有点麻烦了,如果是公司的图片UI需要准备两张倒是可以实现,但是如果是一些其他的图片,譬如用户自己上传的图片,那么我们是无法进行修改的。所以我的做法也很简单,在原来的imageView上面加盖一个蒙版就行,当用户切换到暗黑模式的时候把蒙版打开,这样可以调低图片的亮度值,假如是一张亮色的图片,因为有了蒙版也不会至于那么刺眼。上代码:(由于对比显示,所以我没有用图片直接设置imageView的背景为红色)

UIImageView *imageView = [[UIImageView alloc] init];
    imageView.backgroundColor = [UIColor redColor];
    imageView.frame = CGRectMake(0, 100, self.view.frame.size.width, 300);
    [self.view addSubview:imageView];
    
    UIView *backView = [[UIView alloc] init];
    backView.frame = imageView.frame;
    backView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
    [self.view addSubview:backView];
原来图片
加蒙版以后的图片

这样一对比就会发现加了蒙版的视觉效果不会那么刺眼,我的透明度设置的是0.5,你可以根据你们公司的需求进行设置即可。这样的话也算是完成了网络图片或者轮播图的暗黑模式适配了,

BUT:因为你加了蒙版,所以如果你后面的view或者是imageView有手势的话会失效

所以我们需要对点击到蒙版上的这个事件进行传递,详细的相关资料大家可以自行去搜索。我只告诉你最简单的解决方法,可能会有不严谨的地方。这时候我们只需要自定义一个view,然后在hitTest:(CGPoint)point withEvent:(UIEvent *)event里面让当前的这个蒙版view不响应手势即可。

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    UIView *view = [super hitTest:point withEvent:event];
    if (view== self) {
        return nil;
    }
    return [super hitTest:point withEvent:event];
}
PNG
之前蒙版点击效果

修改后
修改之后点击效果

本文只是默认了当前用户是在暗黑模式下的,实际开发中大家还需要用户在当前页面切换了模式,这个时候就需要在具体的界面监听下面这个方法

-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
   //注意:这里返回的是前一次的状态
    [super traitCollectionDidChange:previousTraitCollection];
    if (@available(iOS 13.0, *)) {
        if (previousTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
            self.backView.hidden = YES;
        }else if (previousTraitCollection.userInterfaceStyle == UIUserInterfaceStyleLight){
            self.backView.hidden = NO;
        }
    } else {
        self.backView.hidden = YES;
    }
}

但是需要注意的是这个方法显示的是前一次的状态。
至此,本文提到的关于暗黑模式的适配全部完成,有了这些以后,整个APP才算得上是完全适配了暗黑模式吧,而不是有一部分是深色的,有些地方却又是亮色的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 原文博客地址: iOS13适配深色模式(Dark Mode) 好像大概也许是一年前, Mac OS系统发布了深色模...
    TitanCoder阅读 36,958评论 8 61
  • 最近公司业务需求要更换APP主题。最开始是一个地方一个地方去改,而且项目中很多老代码是用xib写的,习惯纯代码编程...
    抓鱼猫L阅读 6,132评论 0 10
  • 起床6:20 晨起:走路上班6.2公里,吃早饭 上午门诊理疗、开处方、 午休:吃饭,整理杂记,熏蒸 下午:写病历、...
    七岳一株花阅读 98评论 0 1
  • 今天讨论了一下本周的周末活动,刚开始想了几个好像都不太理想,晚上姐姐把孩子们拉在一起想周末活动,看他们都是对吃...
    Gemini李江容阅读 231评论 2 2
  • 世界上最遥远的距离,是飞鸟与鱼的距离。一个在天上,一个却深潜海底。 我想对你说,我爱你 天荒地老太短,三生三世我怕...
    青小妤阅读 394评论 1 1