gpt4 book ai didi

ios - 如何确定 WKWebView 的内容大小?

转载 作者:IT老高 更新时间:2023-10-28 11:39:13 28 4
gpt4 key购买 nike

我正在尝试在 iOS 8 及更高版本下运行时将动态分配的 UIWebView 实例替换为 WKWebView 实例,但我找不到确定 WKWebView 内容大小的方法。

我的 Web View 嵌入在更大的 UIScrollView 容器中,因此我需要确定 Web View 的理想大小。这将允许我修改其框架以显示其所有 HTML 内容,而无需在 Web View 中滚动,并且我将能够为 ScrollView 容器设置正确的高度(通过设置 scrollview.contentSize)。

我试过 sizeToFit 和 sizeThatFits 都没有成功。这是我创建 WKWebView 实例并将其添加到容器 ScrollView 的代码:

// self.view is a UIScrollView sized to something like 320.0 x 400.0.
CGRect wvFrame = CGRectMake(0, 0, self.view.frame.size.width, 100.0);
self.mWebView = [[[WKWebView alloc] initWithFrame:wvFrame] autorelease];
self.mWebView.navigationDelegate = self;
self.mWebView.scrollView.bounces = NO;
self.mWebView.scrollView.scrollEnabled = NO;

NSString *s = ... // Load s from a Core Data field.
[self.mWebView loadHTMLString:s baseURL:nil];

[self.view addSubview:self.mWebView];

这是一个实验性的 didFinishNavigation 方法:

- (void)webView:(WKWebView *)aWebView
didFinishNavigation:(WKNavigation *)aNavigation
{
CGRect wvFrame = aWebView.frame;
NSLog(@"original wvFrame: %@\n", NSStringFromCGRect(wvFrame));
[aWebView sizeToFit];
NSLog(@"wvFrame after sizeToFit: %@\n", NSStringFromCGRect(wvFrame));
wvFrame.size.height = 1.0;
aWebView.frame = wvFrame;
CGSize sz = [aWebView sizeThatFits:CGSizeZero];
NSLog(@"sizeThatFits A: %@\n", NSStringFromCGSize(sz));
sz = CGSizeMake(wvFrame.size.width, 0.0);
sz = [aWebView sizeThatFits:sz];
NSLog(@"sizeThatFits B: %@\n", NSStringFromCGSize(sz));
}

这是生成的输出:

2014-12-16 17:29:38.055 App[...] original wvFrame: {{0, 0}, {320, 100}}
2014-12-16 17:29:38.055 App[...] wvFrame after sizeToFit: {{0, 0}, {320, 100}}
2014-12-16 17:29:38.056 App[...] wvFrame after sizeThatFits A: {320, 1}
2014-12-16 17:29:38.056 App[...] wvFrame after sizeThatFits B: {320, 1}

sizeToFit 调用无效,sizeThatFits 始终返回高度 1。

最佳答案

我认为我阅读了有关此主题的所有答案,而我所拥有的只是解决方案的一部分。大部分时间我都在尝试实现@davew 所描述的 KVO 方法,它偶尔会起作用,但大部分时间在 WKWebView 容器的内容下留下了一个空白。我还实现了@David Beck 的建议,并将容器高度设为 0,从而避免了容器高度大于内容高度时出现问题的可能性。尽管如此,我还是有偶尔的空白。所以,对我来说,“contentSize”观察者有很多缺陷。我没有太多的网络技术经验,所以我无法回答这个解决方案有什么问题,但我看到如果我只在控制台中打印高度但不做任何事情(例如调整约束),它跳到某个数字(例如 5000),然后跳到最高数字之前的数字(例如 2500 - 结果是正确的数字)。如果我确实将高度约束设置为我从“contentSize”获得的高度,它会将自己设置为它获得的最高数字,并且永远不会调整为正确的高度——@David Beck 评论再次提到了这一点。

经过大量实验,我设法找到了适合我的解决方案:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
if complete != nil {
self.webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
self.containerHeight.constant = height as! CGFloat
})
}

})
}

当然,正确设置约束很重要,这样 ScrollView 才能根据 containerHeight 约束调整大小。

事实证明,didFinish 导航方法永远不会在我想要的时候被调用,但是在设置了 document.readyState 步骤之后,下一个 (document.body.offsetHeight) 得到了在正确的时间调用我,返回正确的高度数字。

关于ios - 如何确定 WKWebView 的内容大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com