iOS:在 didFinishLoad 之后调整 UIWebView 的大小(内容应该适合而不滚动)

Posted

技术标签:

【中文标题】iOS:在 didFinishLoad 之后调整 UIWebView 的大小(内容应该适合而不滚动)【英文标题】:iOS: Resize UIWebView after didFinishLoad (content should fit without scrolling) 【发布时间】:2012-12-01 06:01:27 【问题描述】:

我绝对无法调整 UIWebView 的大小。

我的UIWebView 在.h 中声明并在IB 中连接。 IB 中的高度是 110。但我的文字高度大约是 1500。现在我想更改高度,以便全文无需滚动即可阅读。

什么代码可以在webViewDidFinishLoad 中调整我的UIWebView 的大小?找不到任何可行的方法。

【问题讨论】:

-sizeToFit?否则访问webView.scrollView.contentSize 没有什么对我有用。你有一些代码吗? 我遇到了同样的问题。我让它工作的唯一方法是以编程方式将 webview 添加到视图中,然后只修改它的框架。如果它是通过 IB 添加的,您似乎无法简单地修改它的框架 正是我现在正在做的事情:) 【参考方案1】:

UIScrollView 属性可用于从 ios 5 开始的UIWebView。您可以通过在代理中实现 webViewDidFinishLoad: 消息来使用它来调整视图大小,如下所示:

-(void)webViewDidFinishLoad:(UIWebView *)webView 
    CGRect newBounds = webView.bounds;
    newBounds.size.height = webView.scrollView.contentSize.height;
    webView.bounds = newBounds;

【讨论】:

有一种情况下这不起作用。当 UIWebview 最初高于新内容大小时,它将返回先前的高度:例如。您创建一个高度为 100px 的 webview,然后加载一个只有一行文本的 html,例如应该使用 15px,webViewDidFinishLoad 上的内容大小将是 100px 而不是 15px。但是,如果您的 webview 的高度最初是 1px,则在 webViewDidFinishLoad 上,内容大小将返回 15px。因此,为防止这种情况,请让您的 webview 始终小于预期高度。 @pablobart 我有这样的场景,即选项更改/方向更改后滚动视图高度会变小。有什么解决办法吗?【参考方案2】:

你试过了吗:this answer?

[编辑]

有些人说这行得通:

- (void)webViewDidFinishLoad:(UIWebView *)webView 

// Change the height dynamically of the UIWebView to match the html content
CGRect webViewFrame = webView.frame;
webViewFrame.size.height = 1;
webView.frame = webViewFrame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
webViewFrame.size = fittingSize;
// webViewFrame.size.width = 276; Making sure that the webView doesn't get wider than 276 px
webView.frame = webViewFrame;

float webViewHeight = webView.frame.size.height;

这未经我测试,但有 70 人对此答案投了 ^ 票,并建议设置 sizeTahtFits:CGSizeZero 就像重置你的 frame.size 一样

有些人使用 javascript 来解决这个问题:

- (void)webViewDidFinishLoad:(UIWebView *)webView

NSString *string = [_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"body\").offsetHeight;"];
CGFloat height = [string floatValue] + 8;
CGRect frame = [_webView frame];
frame.size.height = height;
[_webView setFrame:frame];

if ([[self delegate] respondsToSelector:@selector(webViewController:webViewDidResize:)])

    [[self delegate] webViewController:self webViewDidResize:frame.size];


【讨论】:

谢谢kalli,但是内容应该是动态实现的。高度可能会改变。我知道不缩小字体是可能的。 技术上 sizeThatFits: 调用应该通过CGSizeMake(maxWidth, CGFLOAT_MAX) 我在 IB 中构建了 UIWebView(没有子视图)。现在我在 viewDidLoad 和 [self.webview loadHTMLString:description baseURL:nil]; 中设置了 self.webview.delegate = (id)self; - 没有别的。如果我添加类似self.webview = [[UIWebView alloc] init]; 的内容,UIWebView 就会消失。 你用UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];初始化webView了吗?【参考方案3】:

正如上面 john 和 eric 的回答,这段代码有效。

-(void)webViewDidFinishLoad:(UIWebView *)webView 
    CGRect newBounds = webView.bounds;
    newBounds.size.height = webView.scrollView.contentSize.height;
    webView.bounds = newBounds;

但是,在尝试使用此代码时,我发现它返回给我的网页视图正确但来源不正确, 如果任何人都是这种情况,只需使用此代码重置

webView.frame=CGRectMake(webView.frame.origin.x, webView.center.y, webView.frame.size.width, webView.frame.size.height);

y 轴已设置,您可以根据需要获得 webView。

【讨论】:

以上是关于iOS:在 didFinishLoad 之后调整 UIWebView 的大小(内容应该适合而不滚动)的主要内容,如果未能解决你的问题,请参考以下文章

UIWebViewDelegate DidFinishLoad 未在自定义类中触发 (Swift)

iOS UIView drawRect 调整大小动画

Facebook iOS SDK - 跳转到另一个视图

IOS开发中如何调整WKWebView中的图片大小

Today Extension 视图在视图出现后重新调整。 iOS 斯威夫特

在 pushViewController (iOS 11) 之后 NavigationBar 高度未更新