WkwebView调节字体大小获取高度

2023-05-16

一般新闻阅读类APP都有一个功能是调节字体大小,而这类新闻界面一般是由webVIew来实现的,实际上就是怎么实时调节webView的字体大小。

写在前面

前后实验过大概有三四种方法,各有各自的优缺点,记录如下,不确保普遍适用,欢迎交流指正。

追加定位标签

<body>
	. . . 
    <!-- HTML结构 -->
    <div id="test-div">
    </div>
</body>

这个test-div标签不显示任何内容,它的作用就是作为一个锚点,我们通过获取这个锚点在webView的位置,确定webView的高度。

在webView加载完毕后执行JavaScript获取指定标签的位置

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
[webView evaluateJavaScript:@"document.getElementById(\"test-div\").offsetTop" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        CGFloat height = [result doubleValue];
        NSLog(@"scrollHeight = %f", height);
        [self.webView mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.mas_equalTo(height);
        }];
    }];
}

实际运用发现这种方法获取的高度还是蛮准确的,目前项目中采用的是这种方法。不管是字体从大调到小,还是从小调到大,都能获取到准确的高度。

修改css样式

<style type=\"text/css\"> 
	*{
	font-size:18.0px !important;
	background: #ffff32 !important;
	padding-right: 0px !important;
	padding-left: 0px !important;
	line-height: 1.7em !important
	p{
	margin-top:-5px !important;
	}
	body{
	text-align:1.2px; 
	color: #4A4A4A;
	}
</style>

只需要改变font-size:18.0px这个值,然后把html字符串重新注入WkWebView。

offsetHeight/scrollHeight

相信这个方法大家都用过

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {

    [webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        CGFloat height = [result doubleValue];
        NSLog(@"offsetHeight = %f", height);
    }];
}

这种方法有个明显缺陷是,字体从小调到大时,OK,获取的高度没问题;但是你从大调到小时发现获取的高度几乎没有任何改变,这时候再拿来用会导致底部大片留白。
换成document.body.scrollHeight结果也是一毛一样的。
后来了解到这种现象是:
字体从小到大时webView容器不够完全显示会重新排版,并更新自己的容器,此时我们拿到的高度都是准确的,但是当字体从大调到小时,webView容器足够完全显示所有内容,认为没必要去更新容器,导致我们获取的高度是之前的高度。

为了验证上面说法,我在每次html字符串重新注入之前将webView的高度置0,这时不管怎么调拿到的高度都是准确的,但是有个一闪的效果。。。

webkitTextSizeAdjust= ‘100%’"

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    
    //修改字体大小
    [ webView evaluateJavaScript:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '100%'" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        
    }];
}

这种方法也能修改字体大小,同样的,拿到的高度跟上面时一样的,从大到小底部会有大片留白

总结

比较以上几种方法,第一种方法效果还是不错的,但是总感觉追加一个定位标签可能会有什么隐患,还好目前没有?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WkwebView调节字体大小获取高度 的相关文章

  • WKWebView 缩放以适合

    从 UIWebView 转移到 WKWebView 我无法弄清楚如何使用 WKWebView 大小上的 loadHTMLString 函数加载我正在加载的 HTML 以适应视图边界 我现在可以加载 html 但它超出了我视图的右侧和底部 如
  • 在 SwiftUI 中控制嵌套 UIView 的惯用方法是什么

    我想在 SwiftUI 视图层次结构中显示 WKWebView 并且我想使用 SwiftUI 中实现的按钮来控制 WKWebView 我可以通过创建 SwiftUI 来做到这一点WebView实现的类UIViewRepresentable和
  • WKWebView 在设备上显示空白,在模拟器上工作

    我的应用程序的模块之一是网站 该网站主要包含 SVG 绘图 并带有自定义形状的按钮 使用 Raphael js 库 来访问其他绘图 包含 svg 绘图的其他 html 页面 如果设备运行在 iOS 7 上 我使用 UIWebView 并且一
  • Cordova + Crosswalk iOS 仍然使用 UIWebView

    我没有找到很多为 iOS 设置人行横道的说明 看起来应该很简单 cordova plugin add cordova plugin crosswalk webview cordova build ios 因为在执行以下操作之前 我遇到了插件
  • WKWebView中是否可以关闭位置权限?

    我想知道是否可以阻止WKWebView显示位置权限提示 website com 想要使用您当前的位置 我相信它正在显示 因为该网站包含谷歌地图 我对在其位置预加载位置不感兴趣 就像其他问题中所示 我只是不想在 WKWebView 中使用位置
  • Swift WKWebView:调用方法时找不到变量错误

    我正在尝试将 GPS 坐标传递给方法调用setIOSNativeAppLocation 我有下面的代码 但我收到此错误 A JavaScript exception occurred UserInfo WKJavaScriptExcepti
  • 执行 javascript 时不支持的返回类型

    我使用 WKWebview evaluateJavaScript 来执行 javascript 我可以从 javascript 获取字符串 对象和数组 evaluateJavaScript document getElementById t
  • WKWebView 是否使用 Safari 的 cookie?

    根据苹果文档 cookie 在所有应用程序之间共享 并跨进程边界保持同步 但有这个iOS Note iOS 中的应用程序之间不共享 Cookie 所以基本上我不能在我的应用程序中使用 Safari 的 cookie iOS 安全沙箱禁用应用
  • 获取 WKWebView 中静态页面的最终渲染高度

    在我的应用程序中 我使用的是WKWebView它加载带有静态内容的网页 我想知道 的高度contentSize一旦网页完全呈现在WKWebView 所以我想我可以使用webView didFinishNavigation 代表 import
  • 如何返回 WKWebView 历史记录中的起点

    我正在尝试找到一种方法来向后跳转到起点WKWebView历史 假设我有一个主页 起始页 WKWebView init 并带有指向 google com 的链接 所以我点击链接 然后点击下一步谷歌网站我点击另一个链接谷歌地图 所以我距离起始页
  • 在WKWebView中加载html文本

    我用这个代码来加载我的html包含文本的文件WKWebView do guard let filePath Bundle main path forResource readBookNumber ofType html else print
  • 由于“_alwaysRunsAtForegroundPriority”,Ionic 应用程序在 iOS 12.2 上崩溃

    在 iOS 12 2 上 我的应用程序在启动后立即终止 并在 xcode 中显示以下消息 由于未捕获的异常 NSUnknownKeyException 而终止应用程序 原因 setValue forUndefinedKey 此类与键 alw
  • WKWebView 添加为子视图在 Swift 中旋转时不会调整大小

    我正在努力向我的浏览器应用程序添加新的阅读视图 它是另一个视图控制器 仅包含作为子视图添加的 WKWebView 并带有用于关闭视图的按钮 和手势 一切都很好 但是当我旋转设备时 子视图的大小没有调整 所以我的屏幕的一半是空的 阅读视图中的
  • 解包可选值 WKWebView 获取参数时意外发现 nil

    我在 WKWebView 上工作 当我加载没有像这样的参数的 url 时 它工作正常 func loadAddress lat Double lng Double let requestURL NSURL string http url c
  • iOS 11(Beta)中的webKit支持WebRTC吗?

    我有一个 URL 可以在 iOS11 测试版 上的 Safari 上正常工作 音频 视频也可以正常工作 但是 当我使用 WKWebView 加载此 URL 时 它会给我一个错误 不兼容的浏览器 当我在 WebKit 中检查浏览器版本时 它会
  • 使用硬件加速内容截取 WKWebview 的屏幕截图

    我在截屏时遇到严重问题WKWebview内容当有硬件加速内容 一些在 iframe 内运行的特定赌场游戏 到目前为止 我使用了像大家建议的标准截图方式 UIGraphicsBeginImageContextWithOptions conta
  • Xamarin WKWebView 接受自签名证书

    我在网上看到过各种例子说明如何接受它们 但我总是得到发生 SSL 错误 无法与服务器建立安全连接 我要注意的是 该方法肯定被调用 在 iOS 8 4 模拟器和 iOS 11 实际设备上运行 因此未调用的方法不是这里的问题 到目前为止我已经尝
  • 内存警告后 WKWebView 变为空白

    我正在开发一个 iOS 应用程序 它将在 wkWebView 中显示一些 360 度全景内容 该页面确实会加载 但当它收到内存警告时 它会在 iPad 2 上显示空白视图 相关代码 NSURLRequest req NSURLRequest
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • WKWebView 未打开自定义 URL 方案(js 在新窗口中打开自定义方案链接)

    我有一个WKWebView在我的应用程序中 我不使用UIWeb视图 因为由于某种奇怪的原因 它无法正确打开包含大量 JS 代码的网页 当我点击链接时自定义 url 方案 scm 它确实nothing My code void viewDid

随机推荐