自行调整大小的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自己的高度约束?
我应该如何像这种情况动态更改为自动布局?
谢谢~~~
答案 0 :(得分:2)
要获得动态单元格大小,您需要实现以下方法
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return <your estimated cell height>;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
答案 1 :(得分:1)
在视图控制器中设置tableview行高。请参阅以下代码行:
<table class="table">
<tbody>
<tr>
<td>Title:</td>
<td>Position: </td>
<td>Input Type:</td>
</tr>
<tr>
<td>
<input type="text" id="title">
</td>
<td>
<input type="text" id="position">
</td>
<td>
<select id="input">
<option value="1">Drop-down</option>
<option value="2">Radio Buttons</option>
<option value="3">Checkbox</option>
<option value="4">Multiple Select</option>
</select>
</td>
<td>
<input type="checkbox" id="required"> Required ?
</td>
</tr>
</tbody>
</table>
答案 2 :(得分:1)
确保在单元格的updateHeight:
之前执行layoutSubviews
方法。因为如果已经加载了单元格,则必须重新加载tableView才能使新约束生效,因此可以在tableView:cellForRowAtIndexPath:
方法中找出自动约束,或者使用下面的代码。
[tableView beginUpdates];
// your code, alter your cell's constraints here
[tableView endUpdates];
答案 3 :(得分:0)
tableView.estimatedRowHeight = 44.0 //put as per your cell row height
tableView.rowHeight = UITableViewAutomaticDimension
使用 UILabel 的顶部,底部,前导,尾随对比。
确保单元格中 UILabel 的numberOfLine设置为0.
需要提供估算的行高。(提供任何适当的值)
答案 4 :(得分:0)
我今天遇到了这个问题,并通过重写UITableViewCell对象的drawRect方法来解决了这一问题。
- (void) drawRect:(CGRect)rect {
[super drawRect:rect];
[self adjustConstraint];
}