如何增大WKWebView的contentSize高度?尝试代码无效求解决
解决WKWebView手动设置contentSize后无法滚动的问题
你遇到的问题其实很典型——直接修改WKWebView的scrollView.contentSize是行不通的,因为WKWebView内部会根据网页的实际内容自动维护这个尺寸,你手动设置的值很快就会被它的内部逻辑覆盖掉,所以虽然你看到contentSize的数值变大了,但实际滚动范围还是由网页本身的高度决定的。
下面给你几个靠谱的解决方案,根据你的需求选择:
方案1:修改网页内容(最推荐)
如果你的目标是给网页底部增加额外的可滚动空间,最稳妥的方式是通过注入JS代码修改网页本身的布局,让网页内容的实际高度增加,这样WKWebView会自动更新scrollView的contentSize,滚动自然就生效了。
比如给网页body添加底部内边距:
[self.webView evaluateJavaScript:@"document.body.style.paddingBottom = '300px';" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (error) { NSLog(@"注入JS失败:%@", error); } }];
或者在网页末尾插入一个空白的div来占空间:
NSString *jsCode = @"var extraSpaceDiv = document.createElement('div'); " "extraSpaceDiv.style.height = '300px'; " "extraSpaceDiv.style.width = '100%'; " "document.body.appendChild(extraSpaceDiv);"; [self.webView evaluateJavaScript:jsCode completionHandler:nil];
方案2:确保网页内容已完全渲染
如果是因为网页有动态加载的内容(比如异步请求的列表),导致WKWebView还没计算出正确的contentSize,可以在网页加载完成后触发一次布局重计算:
先实现WKNavigationDelegate的webView:didFinishNavigation:方法,然后在里面执行:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { // 读取body的高度,触发WKWebView重新计算contentSize [webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (!error) { NSLog(@"网页实际高度:%@", result); } }]; }
为什么直接修改scrollView.contentSize无效?
WKWebView的scrollView是被它内部管理的,当网页的DOM结构、样式发生变化时,WKWebView会通过WebKit的内核自动计算并更新scrollView的contentSize。你手动设置的数值只是临时修改了内存中的值,后续内核的更新会把它覆盖回去,所以实际滚动范围不会改变。
内容的提问来源于stack exchange,提问作者Artyom
相关产品推荐
相关产品推荐

