UITableViewCell, содержащий UIWebViewCell с динамической высотой и анимацией загрузки - PullRequest
1 голос
/ 21 июня 2011

В настоящее время я пытаюсь вложить UIWebView (среди других элементов) в пользовательский подкласс UITableViewCell.

Мне нужно динамически определять размер ячейки (используя heightForRowAtIndexPath), но по какой-то причине, когда я это делаютаким образом, высота всегда печатается как 0:

UIWebView* wv = [[[UIWebView alloc] init] autorelease];
[wv loadHTMLString:body baseURL:nil];
[wv setNeedsLayout]; //I don't think these are necessary but I tried anyway.
[wv setNeedsDisplay];
CGSize wvSize = [wv sizeThatFits:webViewBounds]; 
NSLog(@"WVHEIGHT %f", wvSize.height); //THIS IS WHERE IT PRINTS.
CGFloat retVal = 10.0f;
retVal += 50 > wvSize.height ? 50 : wvSize.height;
retVal += 2 + 15 + 10;

return retVal;

Теперь, если я делаю то же самое вычисление, используя cell.webView, к которому у меня есть доступ в cellForRowAtIndexPath, он возвращает ненулевое значение.Тем не менее, я бы очень хотел избежать загрузки всей ячейки, просто чтобы выяснить, какова должна быть ее высота ...

Кроме того, UIWebView очень медленно отображает текст (и, к сожалению, я не могу использовать его для обсуждения)UIWebView), поэтому мне было интересно, есть ли способ заставить его отображать типичный значок активности Apple «вращающаяся шестеренка», пока текст не будет полностью загружен и готов к визуализации.

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Я бы порекомендовал скрывать каждый UIWebView, пока он не завершил загрузку, и вместо этого показывать индикатор загрузки. Затем я составил бы словарь с ключами, соответствующими тегам, и для каждой записи в словаре я бы сохранял размер UIWebView.

Настройте контроллер на соответствие протоколу UIWebViewDelegate и используйте следующий код:

- (void)webViewDidFinishLoad:(UIWebView *)webView {

    NSString *output = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('this').offsetHeight;"];

    [self.webViewHeights setValue:[output floatValue] forKey:[NSString stringWithFormat:@"%f", webView.tag]];

}

После этого добавьте код, чтобы скрыть представление загрузки и отобразить UIWebView, а затем вызвать перезагрузку таблицы. В вашем методе высоты ячейки просто проверьте правильный элемент массива для вашей высоты UIWebView.

Edit:

Кажется, я пропустил важную часть!

ОК, поэтому для создания невидимых UIWebViews вам просто нужно создать их, но не добавлять их в представление. Например, вы можете сделать что-то подобное в вашем viewDidLoad методе:

UIWebView *newWebView = [[UIWebView alloc] initWithFrame:newFrame];
[newWebView loadHTMLString:body baseURL:nil];
newWebView.tag = 1;

[self.webViewDictionary setObject:newWebView forKey:@"1"];

Затем в коде вашей таблицы произнесите что-то вроде

NSString *tagString = [NSString stringWithFormat:@"%d", indexPath.row];
UIWebView *curWebView = [self.webViewDictionary objectForKey:tagString];

if (curWebView.loading == NO) {

    CGRect newFrame = curWebView.frame;
    newFrame.size.height = [self.webViewHeights objectForKey:tagString];
    curWebView.frame = newFrame;

    [cell addSubview:curWebView];

} else {

    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorStyleGray];

    [cell addSubview:activityIndicator];

}
0 голосов
/ 21 июня 2011

Я не думаю, что sizeThatFits: это то, что вы хотите использовать.

sizeThatFits:

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

Ваше веб-представление не имеет подпредставлений, толькоHTML.

UIWebView не имеет собственного метода init, поэтому вам, вероятно, следует использовать initWithFrame: (из суперкласса UIView) для непосредственной установки размера.Вы можете установить желаемый размер, который в данном случае является размером ячейки tableView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...