iOS12 UIWebView转换WKWebView

iOS12已经完全弃用UIWebView改用WKWebView
WKWebView是苹果公司在iOS8系统推出的,相比于UIWebView的优势:
1.在性能、稳定性、占用内存方面有很大提升;
2.允许JavaScript的Nitro库加载并使用(UIWebView中限制)
3.增加加载进度属性:estimatedProgress,不用在自己写假进度条了
4.更多的支持HTML5的特性
5.官方宣称的高达60fps的滚动刷新率以及内置手势
6.Safari相同的JavaScript引擎
7.将UIWebViewDelegate与UIWebView拆分成了14类与3个协议(官方文档说明)
8.另外用的比较多的,增加加载进度属性:estimatedProgress

=========================================
用法介绍:

  1. 导入库 :WebKit.framework
  2. 导入头文件 :#import
  3. 如果xib或者storyboard中已经拖拽了WebView,删除WebView,拖拽WebKitView来替换原来的WebView
  4. 在需要实现webView的控制类中创建WKWebView属性
  5. 在需要实现webView的控制类中继承WKNavigationDelegate, WKUIDelegate
  6. 实现委托 :
    wkWebView.navigationDelegate = self;
  7. WKNavigationDelegate代理方法 :
    <1>在发送请求之前,决定是否跳转
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
    <2>页面开始加载时使用
    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation;
    <3>在收到响应是,决定是否跳转
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
    <4>内容开始返回时使用
    - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation;
    <5>页面加载完成时使用
    - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;
    <6>页面加载失败时使用
    - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error;
    <7>接收到服务器跳转请求的时候调用
    - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation;
    tips :
    如果实现关于是否跳转的协议方法,其中decisionHandler必须调用,传入参数为WKNavigationActionPolicyCancel,WKNavigationActionPolicyAllow。
    否则程序会crash。
  8. WKUIDelegate代理方法 :
    UI界面相关,原生控件支持,三种提示框:输入、确认、警告。
    首先将web提示框拦截然后再做处理。
    <1>创建一个新的webView
    - (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
    <2>webView关闭
    - (void)webViewDidClose:(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0));
    <3>警告框
    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
    <4>确认框
    - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
    <5>输入框
    - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler;
    9.加载本地html :
    <1>大概使用方法跟UIWebView是一样的,举例 :
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@“test” ofType:@“html”];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [wkWebView loadRequest:request];
    tips : 路径变成图片路径,同样可以加载图片。
    <2>一些常用属性
    allowsBackForwardNavigationGestures:BOOL类型,是否允许左右划手势导航,默认不允许
    estimatedProgress:加载进度,取值范围0~1
    title:页面title
    .scrollView.scrollEnabled:是否允许上下滚动,默认允许
    backForwardList:WKBackForwardList类型,访问历史列表,可以通过前进后退按钮访问,或者通过goToBackForwardListItem函数跳到指定页面

tips :

  1. 如果需要背景色透明,需要设置以下参数 :
    wkWebView.backgroundColor = [UIColor clearColor];
    wkWebView.opaque = NO
  2. 禁止拖拽时候的反弹效果 :
    [(UIScrollView *)[[wkWebView subviews] objectAtIndex:0] setBounces:NO];
  3. WKWebView中加载html之后,不会像UIWebView一样,自动缩放,如果需要按照当前webView的大小进行自动缩放的话,需要添加以下代码 :
    • (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified 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];
      }

你可能感兴趣的:(iOS)