UIWebView添加头部视图UIView

简介: 一开始是想到在用个scollview里面嵌入一个头部view,然后在头部view下面在嵌入一个webview。

方案一


一开始是想到在用个scollview里面嵌入一个头部view,然后在头部view下面在嵌入一个webview。


这样的话使得界面变得复杂、臃肿。这个页面是通过scollview来滚动的,所以我们要计算出webview实际内容有多高,我们不能通过一个链接就知道有多高吧,所以需要等webview加载完成之后才能知道具体内容高度


获取webview高度方法:

//    webview加载完成
    func webViewDidFinishLoad(_ webView: UIWebView) {
//        获取webView高度
//        方法1 // 记录高度,有时候计算的高度不准确
        let webViewHeight1 = webView.stringByEvaluatingJavaScript(from: "document.body.scrollHeight") ?? ""
        let webViewHeight2 = webView.stringByEvaluatingJavaScript(from: "document.body.offsetHeight") ?? ""
        let webViewHeight3 = webView.stringByEvaluatingJavaScript(from: "document.body.clientHeight") ?? ""
        print("方法1:\(webViewHeight1):\(webViewHeight2):\(webViewHeight3)")
//        方法2
        let webViewHeight4 = webView.scrollView.contentSize.height
        print("方法2:\(webViewHeight4)")
//        方法3
        let size = webView.sizeThatFits(CGSize.zero)
        print("方法3:\(size.height)")
//        方法4
        if webView.subviews.count > 0 {
            let scrollerView = webView.subviews[0];
            if scrollerView.subviews.count > 0 {
                let webDocView = scrollerView.subviews.last;
                let webViewHeight = webDocView!.frame.size.height;
                print("方法4\(webViewHeight)")
                if webDocView?.classForCoder == NSClassFromString("UIWebDocumentView") {
                    let webViewHeight = webDocView!.frame.size.height;
                    print("方法4\(webViewHeight)")
                    // 更新表上控件的frame
                    // _webView,时间控件,查看数,评论数...的frame,整个表头的frame,再来一句
                }
            }
        }
    }


获取完高度还要重新刷新高度


方案二


为何一定要把webview嵌套在scollview中呢,webview本身就有scollview啊,如果可以在webview中的scollview里面添加头部不是更好吗。


添加头部view


方法1


private func addHeaderView1() {
//        内容偏移height
        webView.scrollView.contentInset = UIEdgeInsetsMake(height, 0, 0, 0)
//        内容的初始位置-height
        webView.scrollView.contentOffset = CGPoint(x: 0, y: -height)
//        内容高度 = 原始高度 - height
        webView.scrollView.contentSize = CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height-height)
//        添加头部
        let headerView = UIView(frame: CGRect(x: 0, y:-height, width: UIScreen.main.bounds.size.width, height: height))
        headerView.backgroundColor = UIColor.yellow
        self.webView.scrollView.addSubview(headerView)
    }


方法2


private func addHeaderView2() {
        let headerView = UIView(frame: CGRect(x: 0, y:0, width: UIScreen.main.bounds.size.width, height: height))
        headerView.backgroundColor = UIColor.yellow
        let browserCanvas = webView.bounds
        for subView in webView.scrollView.subviews {
            var subViewRect = subView.frame
            if(subViewRect.origin.x == browserCanvas.origin.x &&
                subViewRect.origin.y == browserCanvas.origin.y &&
                subViewRect.size.width == browserCanvas.size.width &&
                subViewRect.size.height == browserCanvas.size.height)
            {
                let height              = headerView.frame.size.height
            //        内容偏移height
                subViewRect.origin.y    = height
            //        内容高度 = 原始高度 - height
                subViewRect.size.height = subViewRect.size.height - height
//                重新设置高度
                subView.frame           = subViewRect
            }
        }
        webView.scrollView.addSubview(headerView)
        webView.scrollView.bringSubview(toFront: headerView)
    }



相关文章
|
7月前
|
Web App开发 移动开发 前端开发
52. 【Android教程】网页视图:WebView
52. 【Android教程】网页视图:WebView
112 1
|
前端开发 C#
【C#/WPF】ListView的MVVM例子,及禁止拖动ListView的头部Header
原文:【C#/WPF】ListView的MVVM例子,及禁止拖动ListView的头部Header 一个ListView的MVVM简单例子: ...
1615 0
|
iOS开发
iOS ScrollView嵌套tableview左右滑动时禁止上下滑动
iOS ScrollView嵌套tableview左右滑动时禁止上下滑动
2170 0

热门文章

最新文章