动态增加UILabel&的高度TableView Cell?

时间:2016-03-17 05:31:48

标签: ios objective-c swift uitableview row-height

我有一个UITableView我正在显示一个自定义单元格。我的单元格我有两个标签&一个视图如下图所示。

enter image description here

我已经像这样给了左视图的约束

商品标签约束

enter image description here

中心视图约束

enter image description here

右视图限制

enter image description here
我使用bean类来存储两个标签和数据的数据。将该bean对象添加到一个数组中。我在heightForRowAtIndexPath中使用下面的代码。

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

    // Calculate a height based on a cell
    if(!self.customCell) {
        self.customCell = [self.tableView dequeueReusableCellWithIdentifier:@"thirdcell"];
    }

    // Configure the cell
    Instrument *inst=[arr_instSpecs objectAtIndex:indexPath.row];
    self.customCell.label_item.text=inst.item;
    self.customCell.label_desc.text=inst.desc;


    // Layout the cell

    [self.customCell layoutIfNeeded];

    // Get the height for the cell

    CGFloat height = [self.customCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    // Padding of 1 point (cell separator)
    CGFloat separatorHeight = 1;

    return height + separatorHeight;
}

问题是标签的高度和表视图单元格都没有增加。我已经解释了所有内容。当标签的文字和文字增加时,我想增加标签的大小。当标签尺寸增加时,细胞的高度也必须增加。

8 个答案:

答案 0 :(得分:32)

首先,您不应在自动布局环境中手动计算高度。只需将TopSpace和BottomSpace标签设置为单元格的contentView,并确保将NumberOfLines标签设置为0,将LineBreakMode设置为WordWrap。

另一个约束如下,

<强> ItemLabel:

enter image description here

<强> SeparatorView:

enter image description here

<强> DescriptionLabel:

enter image description here

并为高度添加代表,如下所示

#pragma mark - UITableView Delegates
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 44.0;
}

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

    return UITableViewAutomaticDimension;
}

你应该得到如下输出,

enter image description here

希望这会对你有所帮助。

答案 1 :(得分:5)

设置行高的自动尺寸&amp;估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。

  • 分配并实施tableview dataSource和delegate
  • { "locations": [ { "languageCode": "en", "openInfo": { "status": "OPEN", "canReopen": true }, "name": "accounts/1337/locations/13161337", ... } 分配给rowHeight&amp; estimatedRowHeight
  • 实施委托/数据源方法(即UITableViewAutomaticDimension并向其返回值heightForRowAt

-

目标C:

UITableViewAutomaticDimension

<强>夫特:

// in ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

  @property IBOutlet UITableView * table;

@end

// in ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    self.table.dataSource = self;
    self.table.delegate = self;

    self.table.rowHeight = UITableViewAutomaticDimension;
    self.table.estimatedRowHeight = UITableViewAutomaticDimension;
}

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

    return UITableViewAutomaticDimension;
}

用于UITableviewCell中的标签实例

  • 设置行数= 0(&amp; line break mode = truncate tail)
  • 相对于其superview / cell容器设置所有约束(顶部,底部,右侧)。
  • 可选:如果您希望标签覆盖最小垂直区域,即使没有数据,也可以设置标签的最小高度。

enter image description here

注意:如果您有多个动态长度的标签(UIElements),应根据其内容大小进行调整:调整内容拥抱和压缩阻力优先级`对于要以更高优先级扩展/压缩的标签。

答案 2 :(得分:4)

您需要在加载视图时定义最大估计高度

{{1}}

答案 3 :(得分:4)

这就是我的工作方式。

1)设置否。线条为0。

2)设置LineBreakage。

enter image description here

3)添加约束。

enter image description here

4)更改垂直内容拥抱优先级。

enter image description here

5)在ViewDidLoad上:

override func viewDidLoad() {
    super.viewDidLoad()

    self.sampleTableView.estimatedRowHeight = 600.0;
    self.sampleTableView.rowHeight = UITableViewAutomaticDimension;

    self.sampleTableView.setNeedsLayout()
    self.sampleTableView.layoutIfNeeded()
}

6)在TableView自定义单元格上:

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    sizeToFit()
    layoutIfNeeded()
}

答案 4 :(得分:2)

将您的标签约束设置为Cell,Bottom to cell的顶部,并保持您的前导和尾随约束。 在

"conditions":[["Grupper", "EQ", tags]]

通过使用UITableViewAutomaticDimension将根据您的标签内容增加您的tableview单元格高度,最重要的一点是,选择您的标签然后转到Identity Inspector并在行数中写入0

答案 5 :(得分:1)

Swift 3 / Swift 4

自定义单元格:

class CustomCell: UITableViewCell {

    @IBOutlet var messageLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()

        sizeToFit()
        layoutIfNeeded()

    }

}

viewDidLoad中:

override func viewDidLoad() {
    super.viewDidLoad()        

    self.tableView.estimatedRowHeight = 80
    self.tableView.rowHeight = UITableViewAutomaticDimension

}

和cellForRowAtIndexPath:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     let cell : CustomCell = tableView.dequeueReusableCell(withIdentifier: "yourcellIdentifier", for: indexPath) as! CustomCell
     cell.messageLabel.text = exampleContent[indexPath.row]
     cell.messageLabel.sizeToFit()
     cell.messageLabel.layoutIfNeeded()
     return cell

}

答案 6 :(得分:0)

Swift 4.2

对于BasicSubtitle类型的单元格,首先在viewDidLoad中执行以下操作:

    self.tableView.estimatedRowHeight = 44 // This is the default cell height
    self.tableView.rowHeight = UITableView.automaticDimension

enter image description here

然后选择“标题”并将其行数设置为0。现在,该行将根据“标题”文本调整其高度。您无需执行其他任何操作。

enter image description here

“自定义”单元格类型相同。确保在自定义单元格中使用的标签也设置为0行。

答案 7 :(得分:0)

我正在研究其他人的代码,但给出的答案都不适用于我。约束是正确的。 将标签的“所需宽度”更改为自动,在情节提要中为我完成了这项工作。为此,请在尺寸检查器中取消选中标签的“显式”复选标记。

It should be like this