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)
    }



相关文章
|
定位技术 API 开发工具
Android 按照步骤接入百度地图API,定位显示不了解决办法
Android 按照步骤接入百度地图API,定位显示不了解决办法
791 1
|
人工智能 自然语言处理 Serverless
阿里云函数计算 x NVIDIA 加速企业 AI 应用落地
阿里云函数计算与 NVIDIA TensorRT/TensorRT-LLM 展开合作,通过结合阿里云的无缝计算体验和 NVIDIA 的高性能推理库,开发者能够以更低的成本、更高的效率完成复杂的 AI 任务,加速技术落地和应用创新。
923 14
|
Linux Python
Linux 安装python3.7.6
本教程介绍在Linux系统上安装Python 3.7.6的步骤。首先使用`yum`安装依赖环境,包括zlib、openssl等开发库。接着通过`wget`下载Python 3.7.6源码包并解压。创建目标文件夹`/usr/local/python3`后,进入解压目录执行配置、编译和安装命令。最后设置软链接,使`python3`和`pip3`命令生效。
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
|
开发框架 JavaScript 前端开发
Electron 重大更新,33.0.0版本发布,带来多项新特性与改进!
本文介绍了 Electron 33.0.0 版本的重要更新,包括核心组件的升级(Chromium、Node.js 和 V8),新增功能(如 app.setClientCertRequestPasswordHandler 和 View.setBorderRadius),重要改进和主要问题修复。建议开发者尽快升级,以享受更强大的性能和功能。
833 0
Electron 重大更新,33.0.0版本发布,带来多项新特性与改进!
|
编译器 API C语言
C语言与硬件交互:通过I/O端口控制硬件。
C语言与硬件交互:通过I/O端口控制硬件。
静态资源路径访问不到的问题,Whitelabel Error Page,There was an unexpected error,解决bug的好方法,大量翻看别人的文章,终究是粗心惹的祸
静态资源路径访问不到的问题,Whitelabel Error Page,There was an unexpected error,解决bug的好方法,大量翻看别人的文章,终究是粗心惹的祸
|
存储 数据采集 搜索推荐
「Java面试」一次性带你搞明白面试必问题,谈谈你对ES的理解
ES全称是Elastic Search,它是一个建立在全文搜索引擎库Lucene基础上的开源搜索和分析引擎。ES它本身具有分布式存储、检索速度快的特性。所以,我们经常会用它来实现全文检索的功能。 Elastic官网对ES的定义已经不再是ElasticSearch这一个组件,而是指Elastic Stack生态。
380 0
|
数据采集 机器学习/深度学习 数据挖掘
用 Python 进行时间序列分析
时间序列分析是一种数据分析方法,用于研究按照时间顺序排列的数据序列。这些数据序列可以是股票价格、气温变化、人口增长等。时间序列分析的目的是发现数据中的模式、趋势和周期性,并预测未来的数值。在 Python 中,我们可以使用各种库来进行时间序列分析,其中最常用的是 pandas 和 statsmodels。
|
SQL 监控 Java
【开发规范系列】(三)代码提交规范
【开发规范系列】(三)代码提交规范

热门文章

最新文章