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

Posted

技术标签:

【中文标题】如何使用自动布局动态更改 UITableViewCell 的高度?【英文标题】:How to change UITableViewCell's height dynamically using Auto Layout? 【发布时间】:2017-03-16 08:40:24 【问题描述】:

自定义大小的 UITableViewCellMyTableViewCell.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 添加了一个新方法 p>

-(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。这通常可以解决问题。 你最终发现了吗?这里的所有答案都是为了初始化,而不是在旅途中更新它,这是您(和我)需要的。有什么发现吗? 【参考方案1】:

要获得动态单元格大小,您需要实现以下方法

-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

    return <your estimated cell height>;


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

    return UITableViewAutomaticDimension;

【讨论】:

我已经把它做成了一个自动调整大小的单元格。我的问题是在运行时更改高度,但无论如何谢谢 @LuRui 可以解释到底是什么问题?您是否担心破坏的约束?【参考方案2】:

在视图控制器中设置 tableview 行高。参考以下代码行:

self.tableView.rowHeight = UITableViewAutomaticDimension;

【讨论】:

我已经把它做成了一个自动调整大小的单元格。我的问题是在运行时改变高度,但还是谢谢~。【参考方案3】:

确保您的updateHeight: 方法在单元格的layoutSubviews 之前执行。因为如果单元格已经加载完毕,你必须重新加载tableView才能使你的新约束生效,所以你可以在tableView:cellForRowAtIndexPath:方法中找出你的自动约束,或者下面的代码就是你需要的。

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

【讨论】:

【参考方案4】:
  tableView.estimatedRowHeight = 44.0 //put as per your cell row  height
  tableView.rowHeight = UITableViewAutomaticDimension

为使用的 UILabel 提供顶部、底部、前导、尾随约束。

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

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

【讨论】:

我已经把它做成了一个自动调整大小的单元格。我的问题是在运行时更改高度,但无论如何谢谢 @LuRui 你到底想要什么??如果你想运行时间将数据提供给单元格,然后 self.tableView.reloadData() 将自动管理所有高度。可能会有所帮助【参考方案5】:

我今天遇到了这个问题,通过覆盖 UITableViewCell 对象的 drawRect 方法解决了这个问题。

- (void) drawRect:(CGRect)rect 
    [super drawRect:rect];

    [self adjustConstraint];

【讨论】:

以上是关于如何使用自动布局动态更改 UITableViewCell 的高度?的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局动态更改子视图后调整超级视图的大小

自动布局:窗口调整大小时如何更改框架的原点?

动态更改 UILabel 宽度不适用于自动布局

在自动布局中动态更改 UIScrollView 的大小

自动布局 UITableViewCells 覆盖底部

我如何告诉我所有的自动布局约束来更新自己? (例如,当用户更新他们的系统大小/动态类型时)?