专栏首页陈满iOSiOS·为WKWebView实现夜间模式切换/网页背景颜色切换功能

iOS·为WKWebView实现夜间模式切换/网页背景颜色切换功能

场景需求

  • 单例类ThemeConfig的一个BOOL类型的属性isNight决定是否夜间模式。
  • 某设置页面,通过按钮的事件改变该属性isNight的值。
  • WKWebView网页通过注册并实现KVO方法,监听isNight值的变化,以切换网页背景颜色。

拟解决方案

  • 拟解决方案1
[self.myWKWebView setOpaque:NO];
self.myWKWebView.backgroundColor = themeInfo.selectedBackgroundColor;
  • 拟解决方案2
// 改变网页内容背景颜色
[self.myWKWebView evaluateJavaScript:@"document.body.style.backgroundColor=\"#616465\"" completionHandler:nil];
// 改变网页内容文字颜色
[self.myWKWebView evaluateJavaScript:@"document.body.style.webkitTextFillColor=\"#8F999999\"" completionHandler:nil];
  • 拟解决方案3
// 改变网页内容背景颜色
[self.myWKWebView evaluateJavaScript:@"document.getElementsByTagName('body')[0].style.background='#616465'"completionHandler:nil];
// 改变网页内容文字颜色
[self.myWKWebView evaluateJavaScript:@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= '#8F999999'"completionHandler:nil];

实验结果

第三种方案有效

为上述方案找到适当位置

  • 为响应切换颜色的按钮事件,放到事件源方法中去(实现KVO方法监听,或者UIButton添加的事件)
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    //先判断是否应该切换颜色,通过获取单例的isNight判断
    //采用上述拟解决方案3可实现
}
  • 为初次进来能根据历史设置切换颜色,放到网络加载完成的代理方法中,先判断模式,再响应改变颜色。
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    //先判断是否应该切换颜色,通过获取单例的isNight判断
    //采用上述拟解决方案3可实现
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【iOS开发】UITableView优化

    移动开发中,任何一个应用都或多或少的有列表的存在,列表的上下滑动直接关系到用户体验。如果处理不好,就会使得列表滑动起来有明显的卡顿效果。所以对列表的优化,让它更...

    吴老师
  • 【iOS开发】RxSwift入门:从Observable.create讲起

    刚学习RxSwift的时候,到github看文档,搜索别人的博客。基本上都是从那些例子讲起,像下面这样,自己再跟着用playground写一篇。

    吴老师
  • 【iOS开发】iOS 动画详解

    在移动开发中,为了提高用户体验,会用到一些动画来提高应用的视觉效果。让人有眼前一亮的感觉。同时有动画的过渡过程,会让应用看起来不是那么的生硬,更吸引用户。

    吴老师
  • 【iOS开发】UITableView和UICollectionView多种类型cell处理,更好地组织代码

    开发不仅仅是完成功能,还要写出认后来人可以很容易上手维护的代码。今天就记录一下列表数据,多种类型cell时,如何更好的组织代码。从实际需求场景出发,先看一下UI...

    吴老师
  • 【iOS开发】Cocoapods详解-使用及创建私有库

    CocoaPods现在是通过target来组织的,如果项目有多个target,可以写多个target为每个target引入不同的第三方库。 写法:

    吴老师
  • 【iOS开发】一些不错的文章博客整理

    吴老师
  • 【iOS开发】RxSwift中的Subject(PublishSubject/BehaviorSubject/ReplaySubject/Variable)

    PublishSubject 即是一个被观察者(Observable)也是一个观察者 (Observer)

    吴老师
  • 【iOS开发】浅谈iOS列表分页数据管理

    @property (nonatomic, copy) NSMutableArray *list; @property (nonatomic) NSInteg...

    吴老师
  • 如何在Linux,Mac或Windows上安装Git

    Git是由Linus Torvalds为Linux内核设计开发的。Git为非线性的分布式开发提供了支持,允许多个项目成员同时在一个项目上进行开发。Git是最流行...

    Techeek
  • 【iOS开发】启动时间优化,runloop的一个小技术点

    刚接触项目不久,最近产品说有一个点要优化,App的启动页面显示时间太长了。一直在开发其它的app,还真没注意这个点,去看了一下还真是,有的时候启动页面的显示时间...

    吴老师

扫码关注云+社区

领取腾讯云代金券