Ios 更新UITableViewCell的高度

Ios 更新UITableViewCell的高度,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我正在构建一个表,显示用户的条目。其中一个单元格显示从服务器下载的一组“标记”。我目前正在构建一组UILabel,并手动将它们添加到单元格中包含的视图中。尽管如此,添加标记后单元格不会动态调整大小。标记与它下面的单元格重叠,我不知道如何手动更新单元格的高度 在cellForRowAtIndexPath中: JournalTagsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JournalTagsCell" forIndex

我正在构建一个表,显示用户的条目。其中一个单元格显示从服务器下载的一组“标记”。我目前正在构建一组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)];
}
-(void)updateTagsView:(UIView*)viewToUpdate{
NSArray*items=self.journalObject.journalEntryTags;
//首先清理视图
NSArray*viewsToRemove=[viewToUpdate子视图];
用于(viewsToRemove中的UIView*v){
[v从SuperView移除];
}
浮点数x=10;
浮动y=10;
对于(int i=0;i(self.view.frame.size.width-20)){
y+=尺寸、高度+10;
x=10;
}
UILabel*lbl=[[UILabel alloc]initWithFrame:CGRectMake(x,y,size.width,size.height)];
lbl.userInteractionEnabled=是;
[lbl SETEXT:[NSString stringWithFormat:@“%@”,项[i]];
[lbl setFont:[UIFont tagCopy]];
[lbl sizeToFit];
[lbl setTextColor:[UIColor COLOR WITH RED:0.145绿色:0.392蓝色:0.576阿尔法:1.000];
[lbl setBackgroundColor:[UIColor颜色与红色:0.804绿色:0.871蓝色:0.914 alpha:1.000];
lbl.layer.borderWidth=1;
lbl.layer.borderColor=[UIColor colorWithRed:0.145绿色:0.392蓝色:0.576 alpha:1.000].CGColor;
lbl.layer.cornerRadius=5;
[lbl.layer setMasksToBounds:是];
[viewtoopdate addSubview:lbl];
UITapGestureRecognitor*点击手势=
[[UITapGestureRecognitizer alloc]initWithTarget:self action:@selector(userClickedOnTag:)];
[lbl AddGestureRecognitor:Tap手势];
x+=尺寸、宽度+10;
如果(x>(自视图帧大小宽度-20)){
y+=尺寸、高度+10;
x=10;
}
if(i==items.count-1){
y+=尺寸、高度+20;
}
}
[viewToUpdate setFrame:CGRectMake(0,0,self.view.frame.size.width,y)];
}

但是,我不知道如何根据此视图的大小手动更新此单元格的高度。我不想/需要手动计算每个单元格的高度,只计算这一个,这就是为什么我目前不使用heightforrowatinexpath,但我不知道如何更新这一个单元格的高度。显然,如果必要的话,我可以计算这个单元格所需的高度,因为我已经设置了保存标签的视图框架,但是由于不必遍历每个单元格并手动计算每个单元格的高度,我感到很为难。

我想你必须使用
heightforrowatinexpath
。我不确定你是否完全明白发生了什么。也许我弄错了。。无论如何,我的理解是:“单元”的总高度将始终显示出来。您从未设置单元格的“高度”,它将自动显示整个内容
heightForRowAtIndexPath
不是告诉单元格应该有多高的方法,而是告诉tableView应该为该特定单元格保留多少空间。如果传递的高度过短,它仍将显示整个单元格,但下一个单元格将很快开始。它的工作原理也是相反的,如果你传递了一个比需要的更大的数字,它看起来就像细胞更大,即使细胞不是。这只是tableView的表示形式。

如果您使用的是iOS 8,您可以使用UITableViewAutomaticDimension。您可以查看这个


您还可以了解一下:2014年WWDC的表视图和集合视图中的新增内容。

您可以使用该行高度的变量来解决该问题。在
viewDidLoad()
中,将默认单元格高度存储到变量中。然后,在计算视图的高度时,将视图的高度存储到变量中,并通过在数组中传递单个单元格的indexpath为tableview使用LOWER方法重新加载该单元格

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
它将通过调用单元格的所有生命周期方法在特定索引处更新单元格

确保为
heightforrowatinedexpath()
中的所有其他单元格返回默认值,带有标记的单元格和计算高度的单元格除外

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

如果带有tagsView的单元格不是用rowIndex预定义的,您也可以将该rowIndex存储在
cellForRowAtIndexPath()

中的一个整数变量中。使用自动布局,将此视图的四个角固定到单元格。iOS 8 autolayout可以自动向TableView提供单元格的高度。但这只适用于使用约束的情况;如果你以编程方式添加子视图,你还需要以编程方式添加约束。是的,看起来就是这样。我真的希望有办法解决这个问题,因为计算每个单元格的高度会很麻烦。@JamesDobson根据您的内容,您可能不必计算每个单元格。如您所说,如果只需要一个单元格就可以更高,并且您知道它是哪一个(数据源中的哪个索引),您可以在
heightForRow..
中执行类似操作(假设高的一个是第五个元素):
If(indexPath.row==4)返回88;否则返回44就是这样。然而,如果它是一个动态数据源,它的内容会随着时间的推移而改变,那么这是不可能的。但是,
-(CGFloat)tableView:(UITableView *)myTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexpath.row == TAGSVIEW_ROWINDEX)
        return calculated_height_value;
    return default_row_height;
}