如何在UITableView中单独更改自定义单元格的高度?

时间:2016-02-11 05:36:28

标签: ios objective-c uitableview

我正在尝试根据UILabel的长度单独更改每个单元格的高度,但似乎没有改变。

我找到了以下问题:How to change cell height dynamically in UITableView static cell

我尝试了这个问题的解决方案:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //return 110;

    NewsFlashCustomCell *cell;

    static NSString *CellIdentifier = @"CustomCell";

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    [cell layoutIfNeeded];
    return cell.messageLabel.frame.origin.y + cell.messageLabel.frame.size.height;

}

然而,这似乎无能为力。

这是一个截图:

enter image description here

我喜欢含有"潮汐波的细胞的高度"和" mashup"小于最后2个单元格,因为它有更长的消息。

我无法执行indexPath.row检查以单独更改每个单元格,因为每条消息都是从数据库中提取的,因此消息的长度会有所不同。

可以做些什么?

如果它有帮助,这里是我的约束的截图:

enter image description here

感谢。

更新:

我在viewDidLoad中添加了以下代码:

tableView.rowHeight = UITableViewAutomaticDimension;

这就是它的样子:

enter image description here

4 个答案:

答案 0 :(得分:0)

请在viewDidLoad中写下以下一行:

_tableView.rowHeight = UITableViewAutomaticDimension;

请确保以下几点:

  1. 不要创建标签的高度限制
  2. 使该标签的宽度等于屏幕尺寸或内容视图
  3. 应用前导,尾随,顶部和底部约束
  4. 不要写heightForRowAtIndexPath方法
  5. 请告诉我结果

    编辑:

    cellForRowAtIndexPath方法

    中写下以下一行
    myLabel.preferredMaxLayoutWidth = cell.contentView.frame.size.width;
    

答案 1 :(得分:0)

如果无法使用其他方法设置,请根据单元格高度减小标签字体大小。

label.numberOfLines=0;
 label.clipsToBounds=YES;
 label.adjustsFontSizeToFitWidth=YES;
 label.lineBreakMode = NSLineBreakByWordWrapping;

答案 2 :(得分:0)

您可以根据文本的长度计算标签的高度,并按照以下方式执行:

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

    return [self calculateHeightForCellAtIndexPath:indexPath];
}

#pragma mark - cell height handling
-(CGFloat)calculateHeightForCellAtIndexPath:(NSIndexPath *)indexP{


    UILabel *lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width-22, defaultHeightOfYourLabel)];

    NSString *strLbl;
    strLbl = [yourArray objectAtIndex:indexP.row];

    lbl.text = strLbl;

    if (IS_IPAD) {

        [lbl setFont:fontRegular15];

    }else{

        [lbl setFont:fontRegular12];

    }

    UIFontDescriptor * fontDLBLTime = [lbl.font.fontDescriptor
                                       fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];

    if (IS_IPAD) {

        [lbl setFont:[UIFont fontWithDescriptor:fontDLBLTime size:15]];

    }else{

        [lbl setFont:[UIFont fontWithDescriptor:fontDLBLTime size:12]];

    }

    [lbl setLineBreakMode:NSLineBreakByClipping];

    [lbl setNumberOfLines:0];

    int noOfLines = [GlobalFunction lineCountForLabel:lbl];

    CGFloat height = [GlobalFunction heightForWidth:lbl.frame.size.width usingFont:lbl.font forLabel:lbl];

    if (noOfLines>1) {

        return height + 33; //here 33 is sum of top and bottom space from view.

    }

    return 50; //default height of cell.

}

在你的班级中实现以下方法:

#define CGFLOAT_MAX_HEIGHT 2000.0

+ (int)lineCountForLabel:(UILabel *)label {

    return ceil([self heightForWidth:label.frame.size.width usingFont:label.font forLabel:label] / label.font.lineHeight);

}
+(CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font forLabel:(UILabel *)lbl{
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize labelSize = (CGSize){width, CGFLOAT_MAX_HEIGHT};
    CGRect r = [lbl.text boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
    return r.size.height;
}

您可以根据字体和标签大小自定义lbl

答案 3 :(得分:0)

  1. 让你的标签限制你的细胞边界,就像你已经做的那样。一定要在它周围加上填充物,使它看起来更好。

  2. heightForRowAtIndexPath:计算标签所需的高度(重要的是,您的标签已正确配置为多行和/或自动换行)

  3. 计算标签所需的高度

    CGRect frame = [label.text boundingRectWithSize:CGSizeMake(cell.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:nil];
    
    1. 返回计算出的高度加上填充

      frame.size.height + TopPadding + Bottom Padding

    2. 这是一个动态调整大小单元的一般方法。

      注意:有时这会偏离几个点,因此您可能需要在单元格高度中添加5个额外点以使所有文本适合标签。