如何动态调整自定义单元格高度

时间:2018-01-19 08:00:46

标签: ios objective-c uitableview row-height

我想动态调整自定义单元格高度。

在我的tableView中有三个自定义列:

  1. 产品名称
  2. 产品数量
  3. 产品价格
  4. 现在“产品名称”列未显示全名。它只显示适合的文字。但无法显示全名。

    虽然我已将heightForRowAtIndexPath设置如下:

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        return UITableViewAutomaticDimension;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return UITableViewAutomaticDimension;
    }
    

    这是在我的CustomCell

    中设置的行以下
    self.productNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
    self.productNameLabel.numberOfLines = 0; 
    

    示例:

    NSString *prodName = @"This is my product name which may contain description with it";
    

    因此,在上面的示例中,我的UITableViewCell仅显示了这么多产品名称:This is my product并且它会进一步转义字符串。

    参见下面附带的属性部分和约束......

    enter image description here

    enter image description here

    我想在Nutrient

    中设置产品名称

    enter image description here

    请帮助我,尝试所有可能的解决方案,但无法解决此问题。

    这样我的uitableview数据显示...但无法在营养素中显示全名。

    enter image description here

4 个答案:

答案 0 :(得分:1)

首先,estimatedRowHeight应设置为某个特定数字。它是tableView用于计算滚动指标大小的估计,但并不真正用它来确定单元格的大小。理想情况下,你应该设置如下:

tableView.estimatedRowHeight = 44
tableView.rowHeight = UITableViewAutomaticDimension

然后确保您的单元格已定义自动布局约束,可用于定义其大小,特别是高度。在您的情况下,请确保标签顶部锚点被约束到单元格contentView.topAnchor,并且底部锚点被约束到单元格contentView.bottomAnchor,以及标签的前导和尾随contentView的领先和尾随。因此,当标签含有更多内容时,它会尝试扩展,单元格也应该扩展。

考虑使用UIStackView来管理单元格的内容,因为即使扩展和折叠单元格也会更容易管理。如果这是您的目标,请参阅my answer其他问题。

答案 1 :(得分:0)

在尺寸检验器中为您的标签设置这些值(如图所示)&不要为您的标签设置高度限制。

答案 2 :(得分:0)

你做得很好但需要更多。首先你设置。 tableView.estimatedRowHeight = 44 在你给出的底部约束等于13之后,只要使它大于或等于13.它将适用于你。

答案 3 :(得分:0)

设置行高的自动尺寸&估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。我刚刚测试了以下步骤和代码并且工作正常。

  • 分配并实施tableview dataSource和delegate
  • UITableViewAutomaticDimension分配给rowHeight& estimatedRowHeight
  • 实施委托/数据源方法(即heightForRowAt并向其返回值UITableViewAutomaticDimension

-

目标C:

// 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;
}

<强>夫特:

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension
}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

用于UITableviewCell中的标签实例

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

enter image description here

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