xml地图|网站地图|网站标签 [设为首页] [加入收藏]

和iOS之间的交互问题,WKWebView高度自适应三种方

来源:http://www.ccidsi.com 作者:最新解决方案 人气:69 发布时间:2020-04-15
摘要:四、demo 最新demo请戳:WKWebViewAutoHeight   那是通过KVO的艺术展开监听的。您能够点击进WKWebView的里边看一下,他们每一个属性上边都有非常短的解说,你轻松窥见这一段。举三个得到题

四、demo

最新demo请戳:WKWebViewAutoHeight

     那是通过KVO的艺术展开监听的。您能够点击进WKWebView的里边看一下,他们每一个属性上边都有非常短的解说,你轻松窥见这一段。举三个得到题指标例证。

上述正是本人个人对WKWebView的一些亮堂。demo就不奉上了,这一个要服务端合作。因为自个儿写的H5基本见不了人,哈哈,小编会用尽了全力的!

一、前言

ImportantStarting in iOS 8.0 and OS X 10.10, use WKWebView to add web content to your app. Do not use UIWebView or WebView.

WKWebVIew是iOS8新出的API,目的在于代替原有的UIWebView,相对于UIWebViewWKWebView富有更为刚劲品质和丰裕的API。在品种开采进度中,笔者也更趋势于用WKWebView,但在使用进程中也遇到好些个的主题素材。最近触及使用网页视图超多,本人在tableView和scrollView中嵌套网页视图,在收获网页视图高度碰着过众多的坑,比如高度不纯粹、底部留白断层,滚动一直获得中度难点。以后项目中央银行使的网页视图基本都替换到了WKWebView,关于WKWebView利用的有的坑,作者生硬推荐一篇博客WKWebView 那么些坑,希望接收WKWebView能少走一些弯路,少踩一些坑。好了,话十分少说了,我将项目中获取网页视图中度其实经历分享给我们,希望对你富有助于,下边初步介绍吧!

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

{    

    if ([message.name isEqualToString:@"Share"]) {

             //TODO

    }

}

三、难题消除

  • 消除web断层难点:WKWebView刷新机制小探

    #pragma mark ------ < UIScrollViewDeltegate > ------- scrollViewDidScroll:(UIScrollView *)scrollView { /** < 解决web白屏问题 > */ /** < 需要调用私有API:_updateVisibleContentRects > */ [self.wkWebView setNeedsLayout];}
    

       近年来,大好些个的施用中都停放了H5。那么在iOS应用中怎样安放一个H5,而且和它进行相互作用就成了

这是使用WKWebView的一个新天性MessageHandler来管理JS调用原生方法。要促成JS调用iOS原生方法,步骤见下。

二、目录

  • 通过KVO的方式
  • 透过代办的艺术
  • 通过注入JS的情势,增多网页加载成功回调获取

这种艺术赢得的冲天比较标准,但要注意表格中频仍回调节裁减度的主题材料。

  • 加上监听者

    #pragma mark ------ < Private Method > ------#pragma mark- addWebViewObserver { [self.wkWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];}
    
  • 监听中度变化

    #pragma mark ------ < KVO > ------- observeValueForKeyPath:(NSString *)keyPath ofObject:object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:context { /** < 法2 > */ /** < loading:防止滚动一直刷新,出现闪屏 > */ if ([keyPath isEqualToString:@"contentSize"]) { CGRect webFrame = self.wkWebView.frame; webFrame.size.height = self.wkWebView.scrollView.contentSize.height; self.wkWebView.frame = webFrame; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:3 inSection:0], nil] withRowAnimation:UITableViewRowAnimationNone]; }}
    
  • 移除观望者

    • removeWebViewObserver { [self.wkWebView.scrollView removeObserver:self forKeyPath:@"contentSize"];}

这种措施通过WKNavigationDelegate代办方法- webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation,网页加载成功经过JS获取网页内容中度,但这种措施不自然便是最实在的莫大,那时大概网页内容尚未加载成功,但以实际情况为准。

/** < 法2 > */- webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { //document.body.offsetHeight //document.body.scrollHeight //document.body.clientHeight [webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) { CGFloat documentHeight = [result doubleValue]; CGRect webFrame = webView.frame; webFrame.size.height = documentHeight; webView.frame = webFrame; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:3 inSection:0], nil] withRowAnimation:UITableViewRowAnimationNone]; }]; // CGRect webFrame = self.wkWebView.frame;// CGFloat contentHeight = webView.scrollView.contentSize.height;// webFrame.size.height = contentHeight;// webView.frame = webFrame;// [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:3 inSection:0], nil] withRowAnimation:UITableViewRowAnimationNone];}

其两种家常是接口再次回到HTMLString,然后自身在应用程式顾客端成网页html、head、body那个标签,在卓绝的职位参预以下js代码:

<script type="text/javascript"> window.onload = function() { window.location.href = "ready://"   document.body.scrollHeight; } </script>

接下来依据WKWebView代理方法,就能够确切获取网页中度:

- webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(WKNavigationActionPolicy))decisionHandler { if (navigationAction.navigationType == WKNavigationTypeOther) { if ([[[navigationAction.request URL] scheme] isEqualToString:@"ready"]) { float contentHeight = [[[navigationAction.request URL] host] floatValue]; CGRect webFrame = self.wkWebView.frame; webFrame.size.height = contentHeight; webView.frame = webFrame; NSLog(@"onload = %f",contentHeight); [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:3 inSection:0], nil] withRowAnimation:UITableViewRowAnimationNone]; decisionHandler(WKNavigationActionPolicyCancel); return; } } decisionHandler(WKNavigationActionPolicyAllow);}

其二种方法在自个儿写的demo中是看不到效果的,风乐趣的相恋的人可以温和拼接网页HTMLString测验效果。小编也贴叁个本人在等级次序中增加以上代码片段的任务吗:

<!DOCTYPE html><html><meta charset="utf-8"><meta name="viewport"content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title></title> <head><script type="text/javascript"> window.onload = function() { window.location.href = "ready://"   document.body.scrollHeight; } </script></head><body> //接口返回网页内容,拼接在这里 </body></html>
    [self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context

{  

    if ([keyPath isEqualToString:@"title"]) {

        if (object == self.webView) {

            if(self.navigationController) 

                self.navigationItem.title = self.webView.title;

        }

    }

    else {

        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

    }

}
 window.webkit.messageHandlers. Share.postMessage

五、仿照效法资料

  • ios webview自适应实际内容惊人5种办法
  • iOS中webView嵌套tableView中动态中度难点
  • WKWebView刷新机制小探
  • JS调用OC代码

    [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"Share"];

相信代码已经看得很了然啊。show(State of Qatar就是JS写的艺术,那么些情势可传可不传参数,具体依实际意况而定。此外关于UIWebView和JS的并行,以下一些仅供参谋。

 

 [self.webView evaluateJavaScript:@"show()" completionHandler:^(id _Nullable response, NSError * _Nullable error) { //TODO }];

UIWebView是在iOS2的时候开端应用的。特点是加载速度慢,占用内部存款和储蓄器多,优化困难。WKWebView是在iOS8苹果

- createWebView{ WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init] // 根据需要去设置对应的属性 WKWebView *webView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:config]; webView.navigationDelegate = self; [self.view addSubview:webView]; NSURL *url = [NSURL URLWithString:self.strURL]; [self loadWebViewWithURL:url]; // JS调用OC 添加处理脚本 [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"Share"];}

 [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"Share"];
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

{

    NSString *url = navigationAction.request.URL.absoluteString;

    if(![url isEqualToString:self.strURL]) {

          // 页面跳转

    }

    decisionHandler(WKNavigationActionPolicyAllow);

}
 [self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];

- observeValueForKeyPath:(NSString *)keyPath ofObject:object change:(NSDictionary<NSString *,id> *)change context:context{ if ([keyPath isEqualToString:@"title"]) { if (object == self.webView) { if(self.navigationController) self.navigationItem.title = self.webView.title; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; }}

  那是利用WKWebView的一个新特色MessageHandler来处理JS调用原生方法。要兑现JS调用iOS原生方法,步骤见下。

网页加载初步,结束,失利这多少个都特地轻便,小编就不赘述了。说一下上边这些合同情势,那些点子产生在页面跳转中。WKNavigationActionPolicy是二个枚举,WKNavigationActionPolicyAllow代表同意跳转,WKNavigationActionPolicyCancel代表撤销跳转。对了,这里还应该有二个增补: scrollView嵌套网页和原生view,原生view要基于网页的万丈来结构。自家看齐数不胜数的电子商务利用皆有这种布局,但在算中度上会有各类主题材料,不知底你们有相逢过?

 

  • OC调用JS代码

那是经过KVO的点子开展监听的。您能够点击进WKWebView的内部看一下,他们各类属性下面都有十分长的解释,你容易察觉这一段。举一个获得题指标例子。其余的接近。别忘了,KVO监听在dealloc中移除监听者哦。

本文由68399皇家赌场发布于最新解决方案,转载请注明出处:和iOS之间的交互问题,WKWebView高度自适应三种方

关键词: 68399皇家赌场 iOS 高度 三种 自适应

最火资讯