Я бы порекомендовал скрывать каждый 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];
}