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

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

我试过sizeToFit和sizeThatFits,但没有成功.下面是创建WKWebView实例并将其添加到容器滚动视图的代码:

// 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];

下面是一个实验性的didFinishNavision方法:

- (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.

推荐答案

我想我读了关于这个问题的每一个答案,我所拥有的只是解决方案的一部分.我大部分时间都在try 实现@daview所描述的KVO方法,这种方法偶尔会起作用,但大多数时间都在WKWebView容器的内容下留下了空白.我还实现了@David Beck建议,并将容器高度设置为0,从而避免了容器高度大于内容高度时出现问题的可能性.尽管如此,我还是偶尔有一些空白.

经过大量实验,我终于找到了一个适合我的解决方案:

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相关问答推荐

如何创建具有SPM依赖项的二进制XCFramework?

Xcode 15中的版本控制发生了什么?

RFID scanner 的蓝牙服务 UUID?

使用异步重载实现Swift协议一致性

从 PHAssets 生成图像时,iOS 应用程序因内存问题而崩溃

在视图控制器中实例化视图控制器是否可能/智能?

如何仅更改一个视图的导航标题 colored颜色 ?

iOS SwiftUI - 从以前的 struct 调用函数

如何为视图的 colored颜色 和宽度设置动画?

Xcode 6 App Store 提交失败并显示您的帐户已经拥有有效的 iOS 分发证书

ARKit vs. ARCore vs. Vuforia vs. D'Fusion Mobile vs. Layar SDK

iOS 10 错误:UICollectionView 接收到具有不存在索引路径的单元格的布局属性

在 Swift 中追加字符串

为信用卡输入格式化 UITextField,例如 (xxxx xxxx xxxx xxxx)

Swift:调用中缺少参数标签xxx

iOS 应用程序中的手动语言 Select (iPhone 和 iPad)

单击 GoogleSignIn 按钮时应用程序崩溃

iOS:如何从 URL 调试新启动应用程序

在 iOS 7 中更改返回按钮会禁用滑动导航返回

UIBarButtonItem:目标动作不起作用?