#ios #xcode #uitableview #uiwebview
#iOS #xcode — код #uitableview uitableview #uiwebview
Вопрос:
У меня есть табличное представление со статической ячейкой, в которую встроен UIWebView. Статическая ячейка находится в первом и единственном разделе и является второй статической ячейкой в tableview. Я пытаюсь динамически изменять размер UIWebView И UITableViewCell на основе HTML, который я передаю методу loadHTMLString. Код ниже.
В пределах viewDidLoad:
[self.wbvArticle loadHTMLString:result baseURL:nil];
[self.wbvArticle setDelegate:self];
[self.wbvArticle.scrollView setScrollEnabled:NO];
[self.wbvArticle.scrollView setBounces:NO];
Также есть следующее:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 1)
{
return contentHeightForCell;
}
else return 282;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
contentHeightForCell = [[self.wbvArticle stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] floatValue];
CGRect rect = self.wbvArticle.frame;
rect.size.height = contentHeightForCell;
self.wbvArticle.frame = rect;
[self.wbvArticle sizeToFit];
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
Когда я запускаю это в симуляторе, ячейка таблицы имеет правильный размер, а webview — нет. Кто-нибудь видит что-нибудь необычное? Я просмотрел веб-страницы и stackoverflow, но не смог найти ничего, что могло бы это исправить.
Спасибо за любую помощь.
Ответ №1:
Вам нужно вычислить высоту webview и перезагрузить таблицу с этой новой высотой.
1) Создайте локальную переменную в разделе @interface
float webViewHeight;
2) Затем назначьте эту высоту в cellForRowAtIndexPath
TableView
[webView setFrame:CGRectMake(0, 0, CELL_CONTENT_WIDTH, webViewHeight)];
3) Также установите высоту в heightForRowAtIndexPath
tableview
if (indexPath.row == 0) {
return webViewHeight;
}
4) Наконец, вычислите высоту и перезагрузите tableview
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
CGRect frame = aWebView.frame;
frame.size.height = 1;
aWebView.frame = frame;
CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
aWebView.frame = frame;
webViewHeight = fittingSize.height;
[self.tableView reloadData];
}
Комментарии:
1. Спасибо, я вижу, где я чего-то не хватает. Просто чтобы уточнить — я использую UITableView со статическими ячейками. Является ли это проблемой для запуска cellForRowAtIndexPath?
2. В итоге я изменил его на динамические ячейки, что казалось излишним. Но это устранило проблему. Спасибо!
3. Просто к вашему сведению. Если вы перезагрузите tableview в webViewDidFinishLoad: , это приведет к бесконечному циклу. Поскольку перезагрузка таблицы также перезагрузит WebView самостоятельно, то после завершения загрузки WebView он снова перезагружает tableview, и он просто продолжает работать и работать. Поэтому вы можете установить какой-то флаг или что-то еще, чтобы справиться с этим.
4. Это не сработает. Он переходит в бесконечный цикл. @user1139921, вы правы, нам нужно поддерживать флаг.
Ответ №2:
Или же вы можете просто использовать
#pragma mark - WebView Delegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.webViewHeight = webView.scrollView.contentSize.height;
[self.tableView reloadData];
}