Как определить высоту интерфейса 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);   
}