UIWebView в ячейке UITableView — WebView не заполняет ячейку таблицы

#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];
}