在网上已经有了许多关于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. 使用 ES2015 编写 Gulp 构建

    Gulp 自 v3.9.0 版本增加对 Babel 的支持,也就是说可以使用 ES2015 语法来编写 gulp 任务. 检查 gulp 版本 $ gulp -v 确保 gulp-cli 和 gulp ...

  2. 关于v$librarycache的几个字段含义

    对v$librarycache中的get,pin和reload的含义: Gets: (Parse) The number of lookups for objects of the namespace ...

  3. 禅道迁移(windows_to_linux)

    需求分析 随着禅道数据的增加,原来通过虚拟机提供的mysql服务器相应速度跟不上需求.且原来禅道的前端与数据库分离安装在windows与linux中,现在提供实体服务器,需要将禅道环境迁移. 确认环境 ...

  4. iOS - 集成高德SDK解决Marker点重复点击无效问题

    场景: 在处理Marker点击事件时,此时地图上有Marker点A及Marker点B,当选中Marker点A后,SDK方法 "didSelectAnnotationView"响应了 ...

  5. vue2 在mounted函数无法获取prop中的变量的解决方法

    props: { example: { type: Object, default() { }, }, }, watch: { example: function(newVal,oldVal){ // ...

  6. java基础学习总结——流

    一.JAVA流式输入/输出原理

  7. Oracle tablespace 创建表空间

    定义: 表空间是一个逻辑概念,它的所有数据和结构信息都存储在一个或多个数据文件中,表空间属于数据库的一部分.数据库自带有几个表空间,如system,temp.一般系统将创建几个私用或业务的表空间. 模 ...

  8. 嵌入式常用技术概览之IIC(I2C)

    一.先决知识             (1)模电基础知识(用以理解IIC如何通信) 二.IIC概览               I2C是80年代飞利浦(Philips->NXP->高通)研 ...

  9. vim快捷键与vi

    vim与程序员 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体 ...

  10. Consul的应用

    Consul在集群上的每一个节点(包括Server和Client)都运行一个Agent,通过这个Agent可以进行对Consul所提供的功能的操作,通过调用一系列HTTP API与Agent的交互即可 ...