更新UITableViewCell的高度

时间:2014-12-02 10:35:33

标签: ios objective-c uitableview

我正在构建一个显示用户条目的表。其中一个单元格显示从服务器下载的一组“标签”。我目前正在构建一组UILabel并手动将它们添加到单元格中包含的视图中。虽然这有效,但添加标签后单元格不会动态调整大小。标签与其下方的单元格重叠,我无法弄清楚如何手动更新单元格的高度。

在cellForRowAtIndexPath中:

JournalTagsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JournalTagsCell" forIndexPath:indexPath];


//Check if we have any tags to show
if(self.journalObject.journalEntryTags != nil){
    cell.placeholderLabel.hidden = YES;
    cell.tagsView = [self updateTagsView:cell.tagsView];
}

return cell;

以下是我实际创建每个标记的方法,将它们放置并添加到视图中:

- (void)updateTagsView:(UIView*)viewToUpdate{

    NSArray *items = self.journalObject.journalEntryTags;
    //Clean up the view first
    NSArray *viewsToRemove = [viewToUpdate subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }

    float x = 10;
    float y = 10;

    for (int i = 0; i < items.count; i++) {

        CGRect textRect = [items[i] boundingRectWithSize:CGSizeMake(self.view.frame.size.width - 20, 1000)
                                                 options:NSStringDrawingUsesLineFragmentOrigin
                                              attributes:@{NSFontAttributeName:[UIFont tagCopy]}
                                                 context:nil];
        CGSize size = textRect.size;


        if (x+size.width > (self.view.frame.size.width-20)) {
            y += size.height + 10;
            x = 10;
        }


        UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(x, y, size.width, size.height)];
        lbl.userInteractionEnabled = YES;
        [lbl setText:[NSString stringWithFormat:@" %@ ", items[i]]];
        [lbl setFont:[UIFont tagCopy]];
        [lbl sizeToFit];
        [lbl setTextColor:[UIColor colorWithRed:0.145 green:0.392 blue:0.576 alpha:1.000]];
        [lbl setBackgroundColor:[UIColor colorWithRed:0.804 green:0.871 blue:0.914 alpha:1.000]];
        lbl.layer.borderWidth = 1;
        lbl.layer.borderColor = [UIColor colorWithRed:0.145 green:0.392 blue:0.576 alpha:1.000].CGColor;
        lbl.layer.cornerRadius = 5;
        [lbl.layer setMasksToBounds:YES];
        [viewToUpdate addSubview:lbl];

        UITapGestureRecognizer *tapGesture =
        [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userClickedOnTag:)];
        [lbl addGestureRecognizer:tapGesture];

        x += size.width + 10;

        if (x > (self.view.frame.size.width-20)) {
            y += size.height + 10;
            x = 10;
        }

        if (i == items.count-1) {
            y+= size.height + 20;
        }
    }


    [viewToUpdate setFrame:CGRectMake(0, 0, self.view.frame.size.width, y)];
}

但是,我不知道如何根据此视图的大小手动更新此单元格的高度。我不想/需要手动计算每个单元格的高度,这就是为什么我目前没有使用 heightForRowAtIndexPath ,但我不知道如何更新这个高度一个细胞。显然,如果有必要,我可以计算出我需要的高度,因为我已经设置了包含标签的视图框架,但是不必经过每个单元格并手动计算每个高度,我很难过。

3 个答案:

答案 0 :(得分:1)

我认为你必须使用heightForRowAtIndexPath。我不确定你完全明白发生了什么。或许我错了。无论哪种方式,我如何理解它:“细胞”的总高度将始终呈现。您永远不会设置单元格的“高度”,它会自动显示整个内容。 heightForRowAtIndexPath不是一种告诉单元格应该有多高的方法,而是 tableView 应该为该特定单元格保留的空间。如果你传递的高度太短,它仍会显示整个单元格,但下一个单元格将很快启动。它也可以反过来,如果你传递的数字超过了必要的数量,它看起来就像单元格更大,即使单元格不是。它只是tableView的表示。

答案 1 :(得分:0)

如果您使用的是iOS 8,则可以使用UITableViewAutomaticDimension。您可以查看此example

self.tableView.rowHeight = UITableViewAutomaticDimension;

您还可以查看此video:2014 WWDC中的表和集合视图中的新功能。

答案 2 :(得分:0)

您可以使用该行高度的变量来解决问题。在viewDidLoad()存储变量的默认单元格高度。然后,当您计算视图的高度时,视图的高度变为变量,并通过在数组中传递单个单元格的索引路径来重新加载该单元格,使用下面的方法查看表格视图。

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

它将通过调用单元格的所有生命周期方法来更新特定索引处的单元格。

确保为heightForRowAtIndexPath()中的所有其他单元格返回默认值,但带有带计算高度单元格的tagsView的单元格除外。

-(CGFloat)tableView:(UITableView *)myTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexpath.row == TAGSVIEW_ROWINDEX)
        return calculated_height_value;
    return default_row_height;
}

如果没有使用rowIndex预定义带有tagsView的Cell,您还可以将该rowIndex存储在cellForRowAtIndexPath()中的一个整数变量中。