2

正如标题所说,我正在尝试找到一种方法来调整 UIWebView 的宽度以匹配其内容的宽度,直到某个最大宽度。我也想让它匹配高度,但假设我们能找到合适的宽度,许多其他堆栈溢出帖子都回答了高度问题。

举个例子:

如果 webview 的输入是一个页面Hello World,我想调整 webview 的大小以完全适合Hello world。相反,如果页面是Hello,<br/>Stack Overflow,则应将 webview 设置为足够宽以容纳Stack Overflow一行。如果有一些非常长的输入,则应将 webview 设置为某个给定的最大宽度,并在适当的情况下允许自动换行或侧滚动。理想情况下,这也应该适应不同大小的字体和图像(但可以忽略其他 html 元素)

我已经尝试了许多人们用于将 webview 高度动态设置为其内容高度的不同技术,但它们都没有按照我想要的宽度工作。这里有些例子:

使用 UIWebview 的 scrollView.contentSize 属性:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    webView.frame = CGRectMake(0, 0, [self maxWebViewWidth], 1); // force layout at max Width
    CGFloat width = MIN(webView.scrollView.contentSize.width,[self maxWebViewWidth]); // the width we want to use

    webView.frame = CGRectMake(0, 0, width, 1); // force layout at our width
    CGFloat height = webView.scrollView.contentSize.height; //the height we want to use

    webView.frame = CGRectMake(0, 0, width, height);
}

上面例子的问题是,当我计算宽度时,webView.scrollView.contentSize.width 总是返回 maxWebViewWidth 或更大,永远不会更少,即使输入很短,比如“hello”

如果我们改变

    webView.frame = CGRectMake(0, 0, [self maxWebViewWidth], 1); // force layout at max  Width

    webView.frame = CGRectMake(0, 0, 1, 1); // force layout at some small width

它得到一个与最宽字符匹配的宽度,你会得到这样的结果:

H
e
l
l
o

我使用 sizeThatFits 以及访问高度和宽度的 javascript 方式也取得了类似的结果。

我怀疑上述结果的原因是 webivew 的内容宽度实际上将跨越 webview 的整个宽度,即使它不需要适合所有内容(想象一下左右对齐文本的情况 - 所以内容宽度必须至少跨越整个 webview 宽度)。

另一种产生不同结果的尝试:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    webview.frame = CGRectMake(0,0,1,1);
    [webView sizeToFit];
}

它实际上调整了 webview 宽度以匹配最长的单词:

输入:hello there thisisalongword lol this isnt working

我们得到以下结果:

hello there
thisisalongword
lol this isnt
working

我不太确定为什么会这样,但是……是的。

有没有办法找到不会触发自动换行的最小宽度?

4

1 回答 1

0

试试这个代码

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    int content_height = [[_textWebview stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] integerValue];
    CGRect rect = _textWebview.frame;
    rect.size.height = content_height+15;
    _textWebview.frame = rect;
}
于 2014-01-09T10:12:52.950 回答