【发布时间】:2015-02-15 09:21:51
【问题描述】:
我正在尝试在 iOS 8 及更高版本下运行时用 WKWebView 实例替换动态分配的 UIWebView 实例,但我找不到确定 WKWebView 内容大小的方法。
我的 Web 视图嵌入在更大的 UIScrollView 容器中,因此我需要确定 Web 视图的理想大小。这将允许我修改其框架以显示其所有 HTML 内容,而无需在 Web 视图中滚动,并且我将能够为滚动视图容器设置正确的高度(通过设置 scrollview.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];
这是一个实验性的 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。
【问题讨论】:
-
更新:我仍在寻找解决方案。如果我通过 [self.mWebView loadRequest:req]) 加载远程内容,则可以通过 didFinishNavigation 中的 self.mWebView.scrollView.contentSize 获得大小。但是,如果我通过 [self.mWebView loadHTMLString:s] 加载我的内容,则直到稍后的某个时间才能使用该大小。将 loadRequest 与 dataURL 一起使用并不能解决问题。而且我不知道“稍后”是什么时候。
-
我想知道是否会有一个有意义的答案?考虑到任何时候网页都可能将其内容的大小调整为其窗口的大小,那么我们怎么可能将窗口的大小更改为其内容的大小呢?我认为 WKWebView 不提供intrinsicContentSize 是有原因的,根本没有单一的、有意义的“内在”大小。
-
2021 年:addUserScript 然后使用 ResizeObserver。
标签: ios objective-c ios8 wkwebview