Внутри UITableViewCell я получаю обратный вызов делегата старого UIWebView? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть пользовательская ячейка, внутри которой есть UIWebView, и в зависимости от высоты содержимого я задаю высоту для этой строки.Это делается после того, как я получаю следующий вызов делегата:

- (void)webViewDidFinishLoad:(UIWebView *)webView

Вот что я делаю:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    /* Webview content height change works only if 0.1 sec delay given */

    [GlobalClass delay:^{

        webViewHeight = webView.scrollView.contentSize.height;
        // If I log this, it prints old height
        [tblOptions reloadData];

    } seconds:0.1]; 
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.section) 
    {
        case 0: {
            return webViewHeight;
        }
        case 1: {
            return UITableViewAutomaticDimension;
        }
        case 2: {
            return 60;
        }
        default:
            return 0;
    }
}

Теперь, если первая ячейка загружена, я получаю идеальную высоту (55) но когда загружается вторая ячейка, которая имеет большое содержание (800), но дает (55)Если я вернусь, то это должно быть (55), но в то время это дает (800).

Короче говоря, это дает мне предыдущую высоту вместо текущей высоты веб-просмотра.

Вот моя функция задержки:

+ (void)delay:(void(^)(void))callback seconds:(double)delayInSeconds
{    
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if(callback){
            callback();
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Когда мы обновляем UIWebView контент, мы должны сначала сбросить его высоту до 0 или любого меньшего возможного значения.

В противном случае, если webview.height> фактический contentHeight, он вернетсяwebview.height, но не contentsize.height.

0 голосов
/ 14 февраля 2019

Ну, я думаю, вам нужно представить немного больше контекста для вашей проблемы.Я понимаю, что в UITableView есть много ячеек (я полагаю, исходя из того, что вы сказали «когда загружается вторая ячейка»), и каждая имеет динамическую высоту, зависящую от содержимого UIWebView.Если это так, вот некоторые проблемы, которые я нашел ваш код:

  • Вы используете одну глобальную переменную webViewHeight , чтобы вернуться к делегату heightForRowAtIndexPath (это означает, что все ваши клетки будут иметь эту высоту), что приводит к неверному значению, которое вы получаете.Чтобы решить эту проблему, вы можете вместо этого кэшировать эти значения в словаре.
  • Я видел, что вы перезагружаете свой UITableView каждый раз, когда загружается UIWebView, поэтому, если вы начинаете загружать свой UIWebView где-то в cellForRowAtIndexPath это может вызвать бесконечный цикл.
...