如何使用自动布局动态更改 UITableViewCell 的高度?
Posted
技术标签:
【中文标题】如何使用自动布局动态更改 UITableViewCell 的高度?【英文标题】:How to change UITableViewCell's height dynamically using Auto Layout? 【发布时间】:2017-03-16 08:40:24 【问题描述】:自定义大小的 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 添加了一个新方法 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 的高度?的主要内容,如果未能解决你的问题,请参考以下文章