带有UIWebview的UITableViewCell,可根据内容大小调整高度

时间:2016-06-01 22:04:37

标签: ios objective-c uitableview uiwebview

所以我从API中删除了一个HTML字符串,我正在尝试将其加载到UITableViewCell中的UIWebView中,并且内容在单元格中滚动。我需要让webview的高度调整到内容的大小,然后相应地调整单元格。我在swift中找到了一篇帖子: UITableViewCell With UIWebView Dynamic Height 我尝试做同样的事情,但我遇到了一些麻烦,因为我使用NSMutableArray来存储带有float的NSNumber然后尝试加载它但是在调用webview委托方法之前执行了cellForRowAtIndexPath和heightForRowAtIndexPath所以我将得到一个index out of bounds error。

到目前为止,我有这个:

@interface FGCThreadDetailTableViewController ()

@property (copy, nonatomic) NSArray<FGCThreadModel*>* threads;
@property (copy, nonatomic) NSMutableArray* contentHeights;

@end

@implementation FGCThreadDetailTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[FGCThreadDetailCell class] forCellReuseIdentifier:@"threadDetailCell"];
    self.tableView.estimatedRowHeight = 100;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    [SVProgressHUD show];
    [[FGCThread postsByThreadID:_threadID] subscribeNext:^(id x) {
        _threads = x;
        [SVProgressHUD dismiss];
        [self.tableView reloadData];
    }];
    _contentHeights = [[NSMutableArray alloc] init];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _threads.count;
}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    FGCThreadDetailCell* cell = [tableView dequeueReusableCellWithIdentifier:@"threadDetailCell" forIndexPath:indexPath];
    FGCThreadModel* thread = _threads[indexPath.row];
    cell.webView.delegate = self;
    CGFloat htmlHeight;
    htmlHeight = [_contentHeights[indexPath.row] floatValue];
    cell.webView.tag = indexPath.row;
    [cell.webView loadHTMLString:thread.postBodyHTMLString baseURL:nil];
    cell.webView.frame = CGRectMake(0, 0, cell.frame.size.width, htmlHeight);
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [_contentHeights[indexPath.row] floatValue];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (_contentHeights[webView.tag]) {
        return;
    }
    _contentHeights[webView.tag] = [NSNumber numberWithFloat:[[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] floatValue]];
    [self.tableView reloadData];
}

@end

提前致谢!

1 个答案:

答案 0 :(得分:2)

自动布局方法可能很棘手。更简单的方法是在webViewDidFinishLoad中设置相应单元格的框架。您可以在表格视图上使用cellForRowAtIndexPath来获取显示的单元格(如果它已经显示,它将不会尝试从UITableViewDataSource获取单元格,因为它将被缓存)。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (_contentHeights[webView.tag]) {
        return;
    }
    float height = [NSNumber numberWithFloat:[[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight;"] floatValue]];

    NSIndexPath* indexOfCell = [NSIndexPath indexPathForRow:webView.tag inSection:0];
    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexOfCell];
    cell.frame = CGRectMake(0, 0, cell.frame.size.width, height);
}