一个自动适应内容高度的WebView For iOS

6 篇文章 1 订阅

上班了,写代码,写代码。不适应,蓝瘦香菇

今天遇到一个问题。就是原先的弹框里面是一个UIWebView,产品说随着内容的高度变化而变化,固定高度不满足需求。

好久没有做UI了,还以为UIWebView.scrollView.contentSize.height在webViewDidFinishLoad中可以获取到。但是我错了。Sometimes naive!!!

由于控件是UIWebView,内容是本地资源文件,因此

- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;

self.webView.scrollView.scrollEnabled = NO;
self.webView.scrollView.bounces = NO;
self.webView.delegate = self;

设置好后

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

    NSString *state = [webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];

    if ([state isEqualToString:@"complete"])

    {

        NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];

        float width = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollWidth"] floatValue];

        float height = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight"] floatValue];

      // TODO

       ...

    }

}

这里面有一个比较重要的点:

1. html文件中的head标签需要一个metadata标签
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
2. baseURL参数需要使用main bundle的NSURL,因为需要加载字体,CSS等去计算真实的高度。

 

如果你是WKWebView的使用者

这里面涉及到加载CSS文件,比UIWebView要略微麻烦一点

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    guard
        let path = Bundle.main.path(forResource: "style", ofType: "css"),
        let cssString = try? String(contentsOfFile: path).components(separatedBy: .newlines).joined()
    else {
        return
    }

    let jsString = "var style = document.createElement('style'); style.innerHTML = '\(cssString)'; document.head.appendChild(style);"
    webView.evaluateJavaScript(jsString)
}

 

还有一个更顺滑的方法,CSS在HTML加载之后才会去加载,渲染比较平滑

lazy var webView: WKWebView = {
    guard
      let path = Bundle.main.path(forResource: "style", ofType: "css"),
      let cssString = try? String(contentsOfFile: path).components(separatedBy: .newlines).joined()
    else {
      return WKWebView()
    }

    let source = """
       var style = document.createElement('style');
       style.innerHTML = '\(cssString)';
       document.head.appendChild(style);
    """

    let userScript = WKUserScript(source: source,
                                  injectionTime: .atDocumentEnd,
                                  forMainFrameOnly: true)

    let userContentController = WKUserContentController()
    userContentController.addUserScript(userScript)

    let configuration = WKWebViewConfiguration()
    configuration.userContentController = userContentController

    let webView = WKWebView(frame: .zero,
                            configuration: configuration)
    return webView
}()

打完收工,赶紧提测。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值