iOS项目之WKWebView替换UIWebView相关
在网上已经有了许多关于UIWebView替换为WKWebView的文章,所以在这里就不在多说替换的细节了,不会的可以在网上搜搜。
下面是我在项目中遇到的问题:
问题一:在UIWebView中,网页显示(包括图片显示)比例正常,替换为WKWebView后,比例显示不正常
解决方案:直接上代码
/* 在创建WKWebView的时候,配置环境中添加下面的js语句,可以使界面自适应屏幕 */
// 自适应屏幕宽度js
NSString *jSString = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"; WKUserScript *wkUserScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES]; // 自定义配置,一般用于js调用oc方法(oc拦截URL中的数据做自定义操作)
WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addUserScript:wkUserScript];
解决图片显示比例的代码在我的另外一篇文章中写到过,这里就不再写了。
问题二:将webView添加到cell的contentView中,UIWebView创建的界面能够展示完整,而WKWebView创建的界面只能够展示一部分。
分析:此时出现的白屏问题,详细分析可以去看看这位大神写的简书(WKWebView刷新机制小探):http://www.jianshu.com/p/1d739e2e7ed2,地址已附上。
解决方案:在cell的contentView中添加自定义的scrollView,然后再将WKWebView创建的webView添加到这个scrollView中,就能解决此类白屏问题。
部分代码附上:
@interface WebCell ()<WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler> @property(nonatomic, weak) UIScrollView *webScrollView; @property(nonatomic, weak) WKWebView *webView; @end @implementation WebCell - (UIScrollView *)webScrollView
{
if (!_webScrollView) {
UIScrollView *sv = [[UIScrollView alloc] init];
[self.contentView addSubview:sv];
_webScrollView = sv;
}
return _webScrollView;
} - (WKWebView *)webView
{
if (!_webView) {
// 配置环境
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
// 自适应屏幕宽度js
NSString *jSString = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
WKUserScript *wkUserScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
// 允许视频播放
if (iOS_Version(9.0)) {
configuration.allowsAirPlayForMediaPlayback = YES;
}
// 允许在线播放
configuration.allowsInlineMediaPlayback = YES;
// 允许与网页交互
configuration.selectionGranularity = YES;
// 内容处理池
configuration.processPool = [[WKProcessPool alloc] init];
// 自定义配置,一般用于js调用oc方法(oc拦截URL中的数据做自定义操作)
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
// 添加消息处理,注意:self指代的对象需要遵守WKScriptMessageHandler协议,结束时需要移除
[userContentController addScriptMessageHandler:self name:@"Handle"];
[userContentController addUserScript:wkUserScript];
// 是否支持记忆读取
configuration.suppressesIncrementalRendering = YES;
// 允许用户更改网页的设置
configuration.userContentController = userContentController;
// 创建wk
WKWebView *wv = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
// 设置背景色
wv.backgroundColor = [UIColor clearColor];
wv.opaque = NO;
// 设置代理
wv.navigationDelegate = self;
wv.UIDelegate = self;
// 网页内容禁用滑动
wv.scrollView.scrollEnabled = NO; // kvo添加进度监控
// [wv addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:nil]; // 开启手势触摸
wv.allowsBackForwardNavigationGestures = YES;
// 自适应
[wv sizeToFit]; [self.webScrollView addSubview:wv];
_webView = wv;
}
return _webView;
} #pragma mark - <设置数据>
- (void)setModel:(Model *)model
{
_model = model; // 手动改变图片适配问题,拼接html代码后,再加载html代码
NSString *myStr = [NSString stringWithFormat:@"<head><style>img{max-width:%f !important;}</style></head>", SCREEN_WIDTH - ];
NSString *str = [NSString stringWithFormat:@"%@%@",myStr, model.htmlStr];
[self.webView loadHTMLString:str baseURL:nil];
} #pragma mark - <界面布局>
- (void)layoutSubviews
{
[super layoutSubviews]; [self.webView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.left.right.mas_equalTo(self.contentView);
}];
} #pragma mark - <WKNavigationDelegate>
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
[webView evaluateJavaScript:@"document.body.scrollHeight" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
// 获取webView的高度
CGFloat webViewHeight = [response floatValue];
// 设置自定义scrollView的frame
self.webScrollView.frame = CGRectMake(, , SCREEN_WIDTH, webViewHeight);
// 通过代理方法,刷新表格高度
if ([self.delegate respondsToSelector:@selector(webViewWithChangeHeight:)]) {
[self.delegate webViewWithChangeHeight:webViewHeight];
}
}];
} - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{} - (void)dealloc
{
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"Handle"];
} @end
问题三:webView中有捏合手势,往往在项目中我们不需要这个手势,则看下面的js代码
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
// 禁用网页捏合手势
NSString *injectionJSString = @"var script = document.createElement('meta');"
"script.name = 'viewport';"
"script.content=\"width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no\";"
"document.getElementsByTagName('head')[0].appendChild(script);";
[webView evaluateJavaScript:injectionJSString completionHandler:nil];
}
问题四:如果在webView中,需要点击网页中的图片查看大图时,则看下面的js代码
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
//这里是js,主要目的实现对url的获取
static NSString * const jsGetImages =
@"function getImages(){\
var objs = document.getElementsByTagName(\"img\");\
var imgScr = '';\
for(var i=;i<objs.length;i++){\
imgScr = imgScr + objs[i].src + '+';\
};\
return imgScr;\
};"; [webView evaluateJavaScript:jsGetImages completionHandler:nil]; // 执行js中方法获取图片
[webView evaluateJavaScript:@"getImages()" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
NSString *urlResurlt = [NSString stringWithFormat:@"%@", response];
_mUrlArray = [NSMutableArray arrayWithArray:[urlResurlt componentsSeparatedByString:@"+"]];
if (_mUrlArray.count >= ) {
[_mUrlArray removeLastObject];
}
//urlResurlt 就是获取到得所有图片的url的拼接;_mUrlArray就是所有Url的数组
}]; //添加图片可点击js
static NSString * const jsImageClick =
@"function registerImageClickAction(){\
var imgs=document.getElementsByTagName('img');\
var length=imgs.length;\
for(var i=0;i<length;i++){\
img=imgs[i];\
img.onclick=function(){\
window.location.href='image-preview:'+this.src}\
}\
}"; [webView evaluateJavaScript:jsImageClick completionHandler:nil]; [webView evaluateJavaScript:@"registerImageClickAction()" completionHandler:nil];
} - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
decisionHandler(WKNavigationActionPolicyAllow); //预览图片
if ([navigationAction.request.URL.scheme isEqualToString:@"image-preview"]) {
NSString* path = [navigationAction.request.URL.absoluteString substringFromIndex:[@"image-preview:" length]];
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//path 就是被点击图片的url // 在这里获取网页中的图片数组,进行展示 return;
} if ([navigationAction.request.URL.scheme isEqualToString:@""]) {
// NSLog(@"%@", navigationAction.request.URL);//在这里可以获得事件
return;
}
}
希望以上能帮助更多需要帮助的人,如果有疑问,也希望大神能多多给小弟提意见和建议。
iOS项目之WKWebView替换UIWebView相关的更多相关文章
- iOS开发之WKWebView代替UIWebView
前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...
- 使用WKWebView替换UIWebView
开发App的过程中,常常会遇到在App内部加载网页,通常用UIWebView加载.这个自iOS2开始使用的网页加载器一直是开发的心病:加载速度慢,占用内存多,优化困难.如果加载网页多,还可能因为过量占 ...
- iOS项目之“返回”手势操作相关
在程序中,总会设置“返回”按钮,但不可能在每一个控制器中都去设置一次“返回”按钮,那如何设置全局的“返回”按钮呢? 首先自定义一个导航控制器,在tabBarController中添加子控制器时,使用这 ...
- IOS进阶之WKWebView
前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...
- IOS 进阶之 WKWebView
前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...
- iOS开发之Xcode8推出的WKWebView与UIWebView的使用
一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...
- swift - UIWebView 和 WKWebView(iOS12 之后替换UIWebView)
1.iOS12 之前 使用 UIWebView 1> private lazy var webV : UIWebView = { let v = UIWebView(frame: self.vi ...
- IOS Html富文本渲染方式:DTCoreText、WKWebView、UIWebView的内存占用对比
在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在后端的富文本编辑中,Html应用比较普遍,所以其实需要处理的Html富文本显示的问题,以下这三种方式肯定不是最优的显示Htm ...
- ios项目里扒出来的json文件
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...
随机推荐
- a,abbr,address,area,article, aside, audio标签文档
<a>标签 download属性 <!-- 下载hello.txt --> <a href="test.txt" download="hel ...
- node-log4js3.0.6配置
const log4js = require('log4js'); const conf = { "appenders": { "access": { &quo ...
- Day8 函数指针做函数参数
课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...
- ganglia问题汇总
1.有数据,不出图 排查方法: 1)确保 php-gd 插件已安装 2) 确保rrdtool 的命令路径是正确的 3)确保php.ini中passthru函数是否开启,参数safe_mode 是否为o ...
- 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)
原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...
- C# TreeView 拖拽节点到另一个容器Panel中简单实现
C# TreeView 拖拽节点到另一个容器Panel中简单实现 用了这么久C#拖拽功能一直没有用到也就没用过,今天因为项目需要,领导特地给我简单讲解了下拖拽功能,真是的大师讲解一点通啊.特地写一篇博 ...
- js call 理解
首先直接放定义: 总结 1.前提:fun是函数 2.thisArg是在fun函数运行时 指定的this值 1.使用call来继承,新函数使用已经定义好的函数里的方法 下面直接上实例 函数b直接使用函 ...
- Go语言基础之数据类型
Go语言基础之数据类型 Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. ...
- lis最长上升子序列
因为是最长上升的,可以用一个数组储存上升的序列,如果后一个数字比数组的最大数字还大,就加到末尾去,如果不大于,那么就可以把这个数组中比他大的数字替换掉,因为如果数字更小,后面上升序列更长的可能性更大, ...
- java课程课后作业04之动手动脑
一.多层的异常捕获-1 先贴出代码: public class CatchWho { public static void main(String[] args) { try { try { thro ...