在网上已经有了许多关于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相关的更多相关文章

  1. iOS开发之WKWebView代替UIWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  2. 使用WKWebView替换UIWebView

    开发App的过程中,常常会遇到在App内部加载网页,通常用UIWebView加载.这个自iOS2开始使用的网页加载器一直是开发的心病:加载速度慢,占用内存多,优化困难.如果加载网页多,还可能因为过量占 ...

  3. iOS项目之“返回”手势操作相关

    在程序中,总会设置“返回”按钮,但不可能在每一个控制器中都去设置一次“返回”按钮,那如何设置全局的“返回”按钮呢? 首先自定义一个导航控制器,在tabBarController中添加子控制器时,使用这 ...

  4. IOS进阶之WKWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  5. IOS 进阶之 WKWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  6. iOS开发之Xcode8推出的WKWebView与UIWebView的使用

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  7. swift - UIWebView 和 WKWebView(iOS12 之后替换UIWebView)

    1.iOS12 之前 使用 UIWebView 1> private lazy var webV : UIWebView = { let v = UIWebView(frame: self.vi ...

  8. IOS Html富文本渲染方式:DTCoreText、WKWebView、UIWebView的内存占用对比

    在app的内容页(详情页)中,富文本的显示一直是经常需要处理的问题,而通常在后端的富文本编辑中,Html应用比较普遍,所以其实需要处理的Html富文本显示的问题,以下这三种方式肯定不是最优的显示Htm ...

  9. 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. ...

随机推荐

  1. kaggle竞赛-保险转化-homesite

    时间格式的转化 查看数据类型 查看DataFrame的详细信息 填充缺失值 category 数据类型转化 模型参数设定 结论 该项目是针对kaggle中的homesite进行的算法预测,使用xgbo ...

  2. B - Assignment

    Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this com ...

  3. hdu 1704 Rank (floyd闭包)

    Rank Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. python argparse sys.argv

    python argparse sys.argv class WeiLearningArgumentParser(argparse.ArgumentParser): def __init__(self ...

  5. Java 测试连接Oracle数据库是否成功,ojdbc7.jar包下载

    需要用到的jar 包: 链接:https://pan.baidu.com/s/1I1pC2f81IvbphZ6tWpVFOg 密码:uq0u 测试结果: package pkg; import jav ...

  6. juqery 点击分页显示,指定一页显示多少个,首次加载显示多少个

    源代码html: //源代码:html <div class="jq22"> <div class="hidden"> <li&g ...

  7. MySQL数据库(增删查改)

    创建一个表:create table user( uid varchar(10) , pwd int(10) ); 学生表: create table student( sno varchar(20) ...

  8. 20165311 ch02 课下作业

    补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的

  9. online ddl与pt-osc详解

    Ⅰ.背景 优化sql的过程中发现表上少一个索引,直接加一个?会不会hang住?不加?sql又跑不好,由此引出一个问题--ddl操作怎么做? Ⅱ.闲扯三两句 5.6版本之前的MySQL创建索引不支持on ...

  10. C#4.5-4.7学习总结

    4.5讲的是this关键字.它用于表示对当前实例的引用,它有三种用法,一是访问属性,解决与局部变量名称冲突问题,二是访问成员方法,在类中调用自己的成员方法,就是在一个方法中,通过this.方法名,调用 ...