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

时间:2017-03-16 08:40:24

标签: ios objective-c uitableview autolayout

自行调整大小的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自己的高度约束?

我应该如何像这种情况动态更改为自动布局?

谢谢~~~

5 个答案:

答案 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];
}