Как определить высоту интерфейса UIWebView на основе содержимого, с переменной высотой UITableView?
Я пытаюсь создать 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;
}
Сами ячейки загружаются из ниба, который является просто a UITableViewCell
, содержащим a UIWebView
. (Было бы также хорошо, если бы ячейки только приспособились к самому большому из содержимого html, хотя переменная высота была бы лучше).
Ответы
Ответ 1
Этот код, вероятно, слишком медленный для использования в табличном представлении, но делает трюк. Это не похоже на альтернативу, поскольку UIWebView не предлагает прямого доступа к DOM.
В контроллере представления viewDidLoad
Я загружаю некоторый HTML в веб-просмотр, и когда загрузка закончена, запустите некоторый javascript, чтобы вернуть высоту элемента.
- (void)viewDidLoad
{
[super viewDidLoad];
webview.delegate = self;
[webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
NSLog(@"height: %@", output);
}
Ответ 2
Я был очень рад найти ваши ответы, трюк javascript работал хорошо для меня.
Однако я хотел сказать, что существует также метод sizeThatFits::
CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];
Мы должны установить предпочтительный размер, отличный от нуля, но, кроме того, он всегда работает!
Обычно, поскольку с помощью UIWebViews он работает только во второй загрузке (я использую метод loadHTMLString: ", и да, я вызываю" sizeThatFits: "из метода делегата" didFinishLoad: ").
Итак, поэтому я был очень рад найти ваше решение, которое работает в любом случае.
Ответ 3
Это похоже на работу. Пока.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
CGFloat webViewHeight = 0.0f;
if (self.subviews.count > 0) {
UIView *scrollerView = [self.subviews objectAtIndex:0];
if (scrollerView.subviews.count > 0) {
UIView *webDocView = scrollerView.subviews.lastObject;
if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
webViewHeight = webDocView.frame.size.height;
}
}
}
Он должен безопасно возвращать 0, если он терпит неудачу.
Ответ 4
Проблема с -sizeThatFits:
заключается в том, что она не работает из коробки, по крайней мере, не на iOS 4.1. Он просто возвращает текущий размер webView (независимо от того, вызвал ли он CGSizeZero или произвольный ненулевой размер).
Я выяснил, что он действительно работает, если вы уменьшаете высоту кадра веб-браузера до вызова -sizeThatFits:
.
Посмотрите мое решение: Как определить размер содержимого UIWebView?
Ответ 5
Если у вас есть плохие значения с sizeThatFits в первый раз, но не после, вот возможная причина, с которой я столкнулся: ошибка с внешним CSS.
Кажется, что webViewDidFinisLoad вызывается в ближайшее время, прежде чем внешний CSS будет извлечен, а веб-документ будет полностью построен.
Я думаю, что ошибка исчезает, если вы перезагружаетесь из-за кэша.
Трюк: предварительно загрузите свой CSS с манекеном UIWebView в ближайшее время в своем приложении.
SDK: IOS4
Ответ 6
измерение webview работает, но только тогда, когда оно загрузило его содержимое
- создание webview small (например, 5px)
- загрузите его и дождитесь завершения.
- вызов sizeToFit на нем затем
- получение размера THEN
- перезагрузить табличное представление (верните правильную высоту для ячейки)
Реклама:: D см. мой класс M42WebviewTableViewCell на github, который борется с этим
Ответ 7
Лучше использовать свойство scrollView.contentSize.height
, как показано ниже.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSLog(@"%f",webView.scrollView.contentSize.height);
}