如何使用自动布局动态更改UITableViewCell的高度?

4

自动调整尺寸的UITableViewCell: MyTableViewCell.m

-(void) viewDidLoad{
        UIView *sample = [[UIView alloc] init];
        [self.contentView addSubview: sample];

        //Fake code here. Let sample view fill the whole contentView:
        Constraint1: sample.leading = contentView.leading;
        Constraint2: sample.trailing = contentView.trailing;
        Constraint3: sample.top = contentView.top;
        Constraint4: sample.bottom = contentView.bottom;
        Constraint5: sample.height = 20;
        NSLayoutConstraint:activateConstriant(constraints 1-5);
}

这段代码可以运行,MyTableViewCell的高度为20。

但是,我希望在运行时(此单元格添加到UITableView后)更改高度,因此我在 MyTableViewCell.m 中添加了一个新方法

-(void) updateHeight:(CGFloat)newHeight{
        //Fake code here. change the constant of constraint1 
        Constraint1 = get reference of Constraint1 in viewDidLoad();
        Constraint1.constant = newHeight
}

我运行了代码并调用了 updateHeight:10,然后收到了日志警告:

2017-03-16 16:23:11.102858 [14541:568021] [LayoutConstraints] 无法同时满足约束条件。以下列表中的至少一个约束条件可能不是您想要的。请尝试:     (1) 查看每个约束条件并尝试找出哪些约束条件不符合您的预期;     (2) 找到添加不需要的约束条件的代码并进行修复。      (          "",          "",          "",          ""      ) 将尝试通过破坏约束来恢复

我认为在 viewDidLoad 中创建的约束自动生成了其他约束,比如 contentView.height=20,而对原始约束的更改与系统所创建的约束发生冲突。
我试图更改示例视图的前导而不是高度,在 updateHeight: 中执行更改,它奏效了!因为前导的更改不会影响 contentView 自己的高度约束?
在这种情况下,我该如何动态地更改自动布局?
谢谢~~~

尝试使用sample.translatesAutoresizingMaskIntoConstraints = NO。往往情况下,这能解决问题。 - Rikh
2
你最终找到了吗?这里的所有答案都是关于初始化的,而不是我们需要的即时更新。有什么发现吗? - Lapidus
5个回答

2
要实现动态单元格大小,您需要实施以下方法。
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return <your estimated cell height>;
}

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

我已经将其设置为自适应单元格。我的问题是在运行时更改高度,但无论如何还是谢谢。 - LuRui
@LuRui能否解释一下问题的具体情况?你是否担心破损的约束条件? - Priyal

1

确保在单元格的 layoutSubviews 方法之前执行了你的 updateHeight: 方法。因为如果单元格已经加载,你必须重新加载 tableView 才能使新的约束生效,所以你可以在 tableView:cellForRowAtIndexPath: 方法中了解你的自动布局约束,或者使用以下代码。

[tableView beginUpdates];
// your code, alter your cell's constraints here
[tableView endUpdates];

1

在您的视图控制器中设置表格视图行高。请参考以下代码行:

self.tableView.rowHeight = UITableViewAutomaticDimension;

我已经将其设置为自适应单元格。我的问题是在运行时更改高度,但无论如何还是谢谢您~。 - LuRui

0
今天我遇到了这个问题,通过覆盖 UITableViewCell 对象的 drawRect 方法解决了它。
- (void) drawRect:(CGRect)rect {
    [super drawRect:rect];

    [self adjustConstraint];
}

0
  tableView.estimatedRowHeight = 44.0 //put as per your cell row  height
  tableView.rowHeight = UITableViewAutomaticDimension
  • 给使用的 UILabel 添加顶部、底部、前导和尾随约束。

  • 确保单元格中 UILabel 的 numberOfLine 设置为 0。

  • 需要提供预估行高。(提供任何适当的值)


我已经将其设置为自适应单元格。我的问题是在运行时更改高度,但无论如何还是谢谢。 - LuRui
@LuRui 你具体想要什么?如果你想在运行时将数据提供给单元格,然后self.tableView.reloadData()会自动管理所有高度。也许这会有所帮助。 - Dhaval Bhadania

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接