Встраивание UIWebView в UITableViewCell - PullRequest
0 голосов
/ 25 мая 2011

Я хочу добавить UIWebView в ячейку.HTML-данные изменятся, и я вызову reloadData, когда это произойдет.

Проблема в том, что UIWebView меняется хорошо, но я не могу заставить UITableViewCell правильно соответствовать высоте.Я пробовал и потерпел неудачу в этом решении ...

Когда веб-просмотр загружается:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    CGRect frame = aWebView.frame;
    int old_height = frame.size.height;
    frame.size = CGSizeMake(280, 0);
    aWebView.frame = frame;
    float content_height = [[aWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] floatValue];
    frame = aWebView.frame;
    frame.size = CGSizeMake(280, content_height + 20);
    aWebView.frame = frame;
    NSLog(@"SIZES - %i - %i",old_height + 4,(int) frame.size.height);
    if(old_height + 4 != frame.size.height){
        [self.tableView reloadData];
    }
}

Возвращенная высота ячейки:

return webview.frame.size.height + 20;

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

Спасибо.

Ответы [ 3 ]

13 голосов
/ 27 января 2012

Столкнулся с этой же проблемой, и вот как я ее решил.

Из того, что я могу сказать, UIWebView не будет правильно рассчитывать свою высоту до тех пор, пока не будет добавлен суперпредставление, привязанное к окну. Итак, я сделал 1) создать WebView с альфа 0, затем 2) добавить его в представление моего UIViewController, а затем 3) переписать его в мой UITableViewCell после его загрузки и установить альфа на 1. webViewDidFinishLoad выглядит так.

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    CGRect frame = webView.frame;
    frame.size = [webView sizeThatFits:CGSizeZero];
    frame.size.height += 20.0f; // additional padding to push it off the bottom edge
    webView.frame = frame;

    webView.delegate = nil;

    UITableViewCell *cell =[_cells objectAtIndex:webView.tag];
    [cell.contentView addSubview:[_loadingWebView autorelease]];
    cell.contentView.frame = frame;
    [cell setNeedsLayout];

    webView.alpha = 1.0f;

    [self.tableView beginUpdates];
    NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:webView.tag]];
    [self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];

    // Storing the currently loading webView in case I need to clean it up
    // before it finishes loading.
    _loadingWebView = nil;
}

В моем случае я не использую ячейки моего табличного представления, и у меня есть одна строка для каждого веб-представления на раздел, поэтому измените свой код соответствующим образом.

0 голосов
/ 17 апреля 2016
NSString *htmlStr = Your html text;
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlStr dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(kScreenWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
CGFloat htmlHight = CGRectGetHeight(rect);
0 голосов
/ 25 мая 2011

UIWebView не предназначен для работы внутри другого скроллера (например, UITableView);

И чтобы изменить размер ячейки, вы должны использовать либо свойство UITableView.rowHeight, либо следующий метод UITableViewDelegate:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

И, кстати, [UITableView reloadData] обычно является плохим решением для обновления таблицы.

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