动态高度UITableViewCell自动布局

时间:2015-05-15 06:36:15

标签: ios objective-c uitableview

我的自定义UITableViewCell只有一个UILabelUILabel可能太长而不适合作为一行,因此我必须动态设置UITableViewCell的高度。

我设置UILabel的前导,上限和高度(大于或等于)约束。我错过了任何限制吗?

ProductDetailDescriptionTableViewCell *cell = (ProductDetailDescriptionTableViewCell *)[self productDetailDescriptionCellInTableView:tableView
                                                                                                      indexPath:indexPath];

CGSize cellSize = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

return cellSize.height + 1;

这是在tableView:heightForRowAtIndexPath:

中计算身高代码

我还设置了UILabel的preferredWith。

当我运行我的代码时,单元格的高度为0,标签的框架为

(0,-21,42,21)

我希望有人可以提供帮助。非常感谢你!!!

4 个答案:

答案 0 :(得分:0)

可能是你的逻辑帮助。确保您的标签行设置为0。(label.numberOfLines = 0)。这对我有用。

//Count Cell Size Here - It’s depend on content size of label. Put requiredHeight method in Tableviewcell class.
    - (CGFloat)requiredHeight
    {
        CGSize labelSize = [label.text sizeWithFont: [label font]
                                              constrainedToSize: CGSizeMake(300.0f, 300.0f)
                                                  lineBreakMode: NSLineBreakByTruncatingTail];

        int RowHeight = 30.0f + labelSize.height;

        if (RowHeight < 44) {
            if ([UIScreen mainScreen].bounds.size.width == 320) { // iPhone4 & iPhone5
                 return 45.0f;
            } else if([UIScreen mainScreen].bounds.size.width == 375){ // iPhone6
                 return 54.0f;
            }else{// iPhone6Plus
                 return 59.0f;
            }

        }else{

            if ([UIScreen mainScreen].bounds.size.width == 320) { // iPhone4 & iPhone5
               return 30.0f + labelSize.height;
            } else if([UIScreen mainScreen].bounds.size.width == 375){ // iPhone6
                //return 54;
                return 40.0f + labelSize.height;
            }else{// iPhone6Plus
               //return 59;
                 return 45.0f + labelSize.height;
            }
        }
    }


    //Call your custom cell class here
    - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

         ATableViewCell *cell = (ATableViewCell*)[self tableView:self->tableView cellForRowAtIndexPath:indexPath];
         return [cell requiredHeight];

    }

答案 1 :(得分:0)

更改特殊单元格的框架,如:

{standard input}: Assembler messages:
{standard input}:3349: Error: unsupported relocation against r3
{standard input}:3349: Error: unsupported relocation against svr
{standard input}:3375: Error: unsupported relocation against r3
{standard input}:3375: Error: unsupported relocation against svr
{standard input}:3510: Error: unsupported relocation against r3
{standard input}:3510: Error: unsupported relocation against svr
{standard input}:3517: Error: unsupported relocation against r3
{standard input}:3517: Error: unsupported relocation against svr

还要确保返回自定义高度,如:

 float longLabelRowHeight; // Just for demonstration

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CGSize constraint = CGSizeMake(self.frame.size.width, 9999);
    CGSize size = [label.text sizeWithFont:label.font 
           constrainedToSize:constraint 
               lineBreakMode:UILineBreakModeWordWrap];

    longLabelRowNumber = indexPath.row; //Just for demonstration

    longLabelRowHeight = size.height;

    if (longLabelRowHeight > 44.f) { // or whatever size
        cell.frame.size = CGSizeMake(self.frame.size.width, longLabelRowHight)
    }
}

答案 2 :(得分:0)

更新

我为您创建了一个示例项目check it here

原始答案

我认为最简单的方法如下:

  1. 定义您之间的前导,顶部,尾部和底部约束 标签和单元格的内容视图(无需约束高度)。
  2. Constraints

    1. 现在在你的标签上,将行数设置为0(意味着它会 根据需要将其文本放入尽可能多的行中:
    2. Lines

      这样,它应始终适合您的表格视图单元格,并且文本不会被截断。我不确定将行高设置为自动,因为它应该是默认值,但你可以这样做:self.tableView.rowHeight = UITableViewAutomaticDimension;

      如果您遇到任何问题,我建议在自定义单元格上使用this terrific article

答案 3 :(得分:0)

如果您只想在标签中显示文字,则无需制作自定义单元格。

只需将UILabel的行号设为0(零)

示例

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

cell.textLabel.text = @"This Is an example for dynamic height of UITableviewcell and UILabel in UITableView";
cell.textLabel.numberOfLines = 0;
return cell;

}

您不必指定heightForRowAtIndexPath方法