我正在尝试创建一个UITableView可变高度行,如本问题的答案中所述
我的问题是每个单元格包含一个UIWebView具有不同(静态加载)的内容我无法弄清楚如何根据内容计算合适的高度.有没有办法做到这一点?我尝试过这样的事情:
(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
WebViewCell *cell = (WebViewCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath];
[cell setNeedsLayout];
[cell layoutIfNeeded];
return cell.bounds.size.height;
}
Run Code Online (Sandbox Code Playgroud)
细胞本身是从笔尖加载的,笔尖只是一个UITableViewCell含有a 的笔尖UIWebView.(如果细胞只是将自己调整到html内容的最大值,那也没关系,尽管可变高度会更好).
我正在加载一个任意长度的HTML字符串,UIWebView然后显示在一个UITableViewCell.我不希望它UIWebView独立滚动,UITableView所以我必须调整其高度以适应内容.
这UITableViewCell也是可折叠的,没有显示UIWebView它处于折叠状态的时间.
问题是,我怎么知道这个高度是什么,以便我可以heightForRowAtIndexPath返回一个正确的值并允许表格正确查看和滚动?
这是一些示例代码:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0)
return 286;
if (indexPath.row == 1) {
if (analysisExpanded)
return analysisWebViewHeight + 39;
else
return 52;
}
if (sourcesExpanded)
return sourcesWebViewHeight + 39;
return 53;
Run Code Online (Sandbox Code Playgroud)
}
很简单.39是我在webview的单元格中的一些标题内容的高度.
我正在从一个笔尖加载单元格的"扩展视图",所以要获得我正在调用viewForTag的webview:
UIWebView* sourcesWebView = (UIWebView*)[cell viewWithTag:1];
[sourcesWebView setBackgroundColor:[UIColor clearColor]];
[sourcesWebView loadHTMLString:placeholder baseURL:[NSURL URLWithString:@"http://example.com/"]];
sourcesWebViewHeight = [[sourcesWebView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scrollHeight"] floatValue];
[sourcesWebView setFrame:CGRectMake(sourcesWebView.frame.origin.x, sourcesWebView.frame.origin.y, sourcesWebView.frame.size.width, sourcesWebViewHeight)];
Run Code Online (Sandbox Code Playgroud)
sourcesWebViewHeight是由上面的代码更新的iVar …
我使用UIWebView的是以HTML字符串的形式显示内容 - 不是网站,高于iPhone的屏幕,而不需要滚动webView本身,将其留给父滚动视图.
为了实现这一点,我需要一种方法来获取总文档大小,包括可滚动区域,以设置webView的高度.我尝试了许多不同的Javascript解决方案:
(document.height !== undefined) ? document.height : document.body.offsetHeight // Returns height of UIWebView
document.body.offsetHeight // Returns zero
document.body.clientHeight // Returns zero
document.documentElement.clientHeight // Returns height of UIWebView
window.innerHeight // Returns height of UIWebView -2
document.body.scrollHeight // Returns zero
Run Code Online (Sandbox Code Playgroud)
有没有真正有效的解决方案?
当前(非工作)代码:
[[[self.singlePost.contentText subviews] lastObject] setScrollEnabled:NO];
int content_height = [[self.singlePost.contentText stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] intValue];
NSLog(@"Content_height: %d", content_height);
CGRect rect = self.singlePost.contentText.frame;
rect.size.height = content_height;
self.singlePost.contentText.frame = rect;
Run Code Online (Sandbox Code Playgroud) 我必须在里面添加UIWebView一些按钮和标签UIScrollView.我已经看到很多关于如何添加UIWebView内部的问题UIScrollView但不幸的是他们无法帮助我完成我的任务.所以请不要将其标记为重复或其他内容.
从理论上讲,这个问题可以通过以下步骤解决:
1)制作UIWebView子视图UIScrollView.
2)调用setScrollEnabled:NO了UIWebView禁用其本土滚动.
3)设置内容的大小UIScrollView和UIWebView内部加载的HTML字符串的大小UIWebview.
我正在使用iOS 6和StoryBoards.我添加了UIWebView作为子视图UIScrollView.
然后在我webViewDidFinishLoad,我使用了以下内容:
NSString *webHeight = [webView stringByEvaluatingJavaScriptFromString:@"document.height;"];
NSLog(@"WebView Height %@", webHeight);
Run Code Online (Sandbox Code Playgroud)
这给了我WebView的高度.
在StackOverFlow上,我遇到了以下内容.
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
Run Code Online (Sandbox Code Playgroud)
然后我已将大小设置UISCrollView为大小UIWebView:
mainScrollView.contentSize = …Run Code Online (Sandbox Code Playgroud) 我有一些文本需要在我的应用程序中显示.该文本包含需要交互的链接.我曾尝试制造可点击链接了几个解决方案UITextViews和UILabels.
UITextView 链接
UITextView 提供数据检测器,可以获取URL并使其可以自适应.UILabel使用"Fancy Labels"的链接(http://furbo.org/2008/10/07/fancy-uilabels/)
UIButtons来覆盖链接,并且它们不包含长链接上的文本.最后我决定使用webview.我将文本传递给webview,并围绕它构建一个基本的HTML包装器,所有东西都是hunky-dory.这与Twitter for iPhone(又名Tweetie)使用的方法相同.
我现在唯一的问题是,如果文本太长,webview会剪切溢出并滚动以查看剪切的文本.其次,如果文本太短,那么webview下面就会有一大片浪费的空间.
与Tweetie不同,我在webview下面有更多内容,我想避免滚动溢出或浪费空间.无论如何,webview都是滚动视图的子视图,因此整个页面的内容可以增长,而不需要滚动子视图.
有没有什么方法可以动态调整webview的大小,以便根据它的内容来确定它的高度?
到目前为止,我尝试了很多东西,似乎没有什么是可靠的解决方案:
sizeToFit 什么都不做(或者更可能的是,只是将大小设置为当前帧的大小).sizeThatFits: 无论如何返回当前大小.NSString的sizeWithFont:constrainedToSize:原因是不可行的UIWebView,并UIFont有什么大小18是不同的表示.
scalesPageToFit设置NO和设置为13.5pt整个页面的字体大小(CSS)呈现文本,其大小为同UILabel一个UIFont尺寸18.如果有人能解释我,我会感激不尽.word-wrap: break-word; in order to prevent the webView from scrolling horizontally with long words or URLs. Because of this, the wrapping behaviour between the …我有UIWebView动态设置高度的问题.webview加载包含html的产品说明.我希望UIWebView根据描述的内容改变它的高度.父滚动视图也应该改变它的高度,但是然后根据高度UIWebView.
任何人都可以向我解释如何实现我的观点所需的行为吗?
这是我的视图层次结构:

我想找到来自webservice的html字符串的高度.请建议我最好的解决方案.
提前致谢
在UITextView中,我可以将控件的高度调整为其内容,如下所示:
CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;
Run Code Online (Sandbox Code Playgroud)
但我想使用UIWebView来显示富文本.UIWebVie的内容是:
NSString *myDescriptionHTML = [NSString stringWithFormat:@"<html> \n"
"<head> \n"
"<style type=\"text/css\"> \n"
"body {font-family: \"%@\"; font-size: %@; }\n"
"</style> \n"
"</head> \n"
"<body>%@</body> \n"
"</html>", @"helvetica",
[NSNumber numberWithInt:12], @"yadayadayada..."];
[webView loadHTMLString:myDescriptionHTML baseURL:nil];
Run Code Online (Sandbox Code Playgroud)
所以UIWebView只包含纯文本.如何实现类似于上述UITextView代码的结果?
我有一个包含一些标签的视图控制器和一个在其中加载一些html的UIWebView.所有这些标签和UIWebView都是UIScrollView的子视图.我已禁用UIWebView的滚动,因此标签和UIWebView在UIScrollView中一起滚动.
然后我找到了UiWebView内部的内容大小,根据内容大小更改了UIWebView大小,然后将滚动视图的大小设置为webview的大小.这是我通过在webViewDidFinishLoad中添加以下代码来实现的:
CGRect frame = myWebView.frame;
frame.size.height = 1;
myWebView.frame = frame;
CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
myWebView.frame = frame;
NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
mainScrollView.contentSize = myWebView.bounds.size;
Run Code Online (Sandbox Code Playgroud)
当我使用NSLog来查看webview内容的大小时,我注意到它为相同的内容提供了不同的高度.例如,如果我第一次打开视图控制器,它会显示高度等于915.0,当我在导航中向后移动并返回到该视图控制器时,日志将显示大小为1012.0.
我相信这可能是由于html内容中的图片加载.任何人都可以告诉我如何修复它以便第一次显示正确的高度?谢谢!
更新:如果我使用javascript使用不同的策略,我已经尝试使用以下代码:
CGRect oldBounds = [[self myWebView] bounds];
CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue];
NSLog(@"NEW HEIGHT %f", height);
[myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)];
mainScrollView.contentSize = myWebView.bounds.size;
Run Code Online (Sandbox Code Playgroud)
这段代码每次在日志中给我正确的高度,这正是我想要的,但整个webview向上移动了一点,阻止了它上面的所有标签.我做错了什么以及如何解决它?谢谢!
可能重复:
如何确定UIWebView的内容大小?
海吉斯,
我在将htmlString输入到UIWebView时遇到了问题,我在iphone中设置了webview的帧高度总是265.
webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 41, 320, 265)];
Run Code Online (Sandbox Code Playgroud)
是否有任何属性可以获取UIWebView的内容高度.
如果我只得到一两行内容,那么它在两行之下看起来很奇怪.我怎样才能让它变得动态.请建议任何解决方案.
谢谢,Madan Mohan.
我绝对无法调整我的大小UIWebView.
我UIWebView的声明是在.h和IB中连接的.IB中的高度是110.但是我的文本高度大约是1500.现在我想改变高度,这样全文就可以读取而不需要滚动.
什么代码调整了我UIWebView的内容webViewDidFinishLoad?找不到任何有效的东西.
为了说明我的问题,我创建了以下图形:

红色方块周围的黑色边框应该是iPhone屏幕.在里面,我们有红色a UIScrollView,比屏幕高.事实上,它与a一样高UIWebView,以黄色显示.这UIWebView是一个子视图UIScrollView,滚动禁用.此外,我们有两个蓝色视图,我喜欢称之为页眉和页脚视图.它们也是UIScrollView可滚动边界之外的子视图.
我现在的问题是:如何为此配置自动布局约束?
我已经成功地检索到的UIWebView使用高度代码这个答案,并随后更新UIScrollView的contentSize相应.然而,这并不是一个很好的解决方案,因为UIWebView宽度不会对宽度变化做出反应UIScrollView.
我还设法设置了标题视图的布局约束(使用Masonary):
[headerView makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(@-100);
make.left.equalTo(@0);
make.width.equalTo(scrollView.width);
make.height.equalTo(@100);
}];
Run Code Online (Sandbox Code Playgroud)
但是,像这样设置页脚视图的布局不起作用:
[changeView makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(scrollView.bottom)
make.left.equalTo(@0);
make.width.equalTo(scrollView.width);
make.height.equalTo(@100);
}];
Run Code Online (Sandbox Code Playgroud)
我觉得这不会太困难,并会感谢一些熟悉汽车布局的人的帮助.谢谢!
这似乎是一个常见问题,但我找不到合适的解决方案.我正在尝试重新调整一堆UIWebView以适应他们的内容,但它似乎无法正常工作.到目前为止,我发现的最佳解决方案是这个答案,但它似乎只是偶尔在我的解决方案中工作.我们的想法是在webViewDidFinishLoad:委托方法中重新调整UIWebView的大小.但是,这仍然无法获得正确的尺寸.如果我在引发一些不确定的时间更新后 webViewDidFinishLoad:,内容不会得到正确的大小.
我将在下面描述我的情况,我将在Gist上粘贴相关的来源.
问题描述
我有一种情况,我从JSON API获取数据并在webview中显示数据.API返回一个对象数组,每个对象都有一个带有HTML格式文本的"content"字段.设计师给出了一个结构,其中包含一个(大部分)隐藏视图,您可以向上滑动显示,其中包含所有内容的滚动视图,以非常特殊的方式格式化.
为了实现这一点,我有三个视图控制器:主视图控制器,在主视图控制器上向上滑动以显示的辅助视图控制器,以及从JSON API结果显示一个html格式内容项的三级视图控制器.
辅助视图控制器包含UIScrollView和一组第三视图控制器.每个第三视图控制器都包含一个UIWebView,用于显示HTML格式的内容,以及用于显示JSON对象的其他属性的标签.因为第三视图将显示在辅助视图中的UIScrollView内,所以需要重新调整第三视图的UIWebView以适合其内容并禁用用户交互以防止滚动视图中的滚动视图混乱场景.
使所有这些工作的过程如下:
loadHTMLString:预定义的html文件的内容设置UIWebView 的内容,并替换JSON对象的内容.webViewDidFinishLoad:委托方法上,使用此答案中的方法,根据内容大小重新调整Web视图的大小.iphone ×10
uiwebview ×10
ios ×9
objective-c ×7
uiscrollview ×3
javascript ×2
xcode ×2
cocoa-touch ×1
font-size ×1
height ×1
ios7 ×1
uikit ×1
uitableview ×1