Как определить высоту UIWebView на основе содержимого, внутри переменной высоты UITableView? - PullRequest
69 голосов
/ 13 апреля 2009

Я пытаюсь создать 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;
    }

Сами клетки загружаются из пера, который представляет собой просто UITableViewCell, содержащий UIWebView. (Также было бы хорошо, если бы ячейки просто настраивались на самое большое содержание html, хотя переменная высота была бы лучше).

Ответы [ 7 ]

77 голосов
/ 15 апреля 2009

Этот код, вероятно, слишком медленный для использования табличного представления, но делает свое дело. Похоже, альтернативы нет, так как 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);
}
28 голосов
/ 06 июня 2009

Я был очень рад найти ваши ответы, уловка javascript сработала для меня.

Однако я хотел бы сказать, что есть также метод "sizeThatFits:":

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];

Мы должны установить предпочтительный размер, отличный от нуля, но, кроме этого, он обычно всегда работает!

Обычно, поскольку в UIWebViews он работает только при второй загрузке (я использую метод loadHTMLString: и да, я вызываю sizeThatFits из делегата метода didFinishLoad:).

Так вот почему я был очень рад найти ваше решение, которое работает в любом случае.

6 голосов
/ 07 августа 2009

Это похоже на работу. На данный момент.

- (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 голосов
/ 15 октября 2010

Проблема с -sizeThatFits: заключается в том, что он не работает "из коробки", по крайней мере, на iOS 4.1. Он просто возвращает текущий размер веб-представления (независимо от того, вызывается ли он с помощью CGSizeZero или произвольного ненулевого размера).

Я обнаружил, что на самом деле это работает, если вы уменьшаете высоту кадра веб-представления перед вызовом -sizeThatFits:.

См. Мое решение: Как определить размер содержимого UIWebView?

3 голосов
/ 24 ноября 2012

измерение веб-просмотра работает, но только когда оно загрузило свой контент

  • уменьшение размера веб-просмотра (например, 5 пикселей)
  • загрузить и дождаться окончания
  • вызывая sizeToFit, затем
  • получая размер ТО
  • перезагрузить таблицу (вернуть правильную высоту для ячейки)

реклама:: D смотрите мой класс M42WebviewTableViewCell на github, который борется с этим

3 голосов
/ 09 августа 2010

Если у вас неправильные значения с sizeThatFits в первый раз, но не после, вот возможная причина, с которой я столкнулся: ошибка с внешним CSS. Кажется, что webViewDidFinisLoad вызывается в ближайшее время, до того, как внешний CSS извлечен, а веб-документ полностью собран. Я думаю, что ошибка исчезает, если вы перезагрузите из-за кеша.

Трюк: предварительно загрузите ваш CSS с помощью фиктивного UIWebView в вашем приложении.

SDK: IOS4

2 голосов
/ 30 августа 2015

Лучше всего использовать свойство scrollView.contentSize.height, как показано ниже.

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     NSLog(@"%f",webView.scrollView.contentSize.height);   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...