【问题标题】:How to change UITableViewCell's height dynamically using Auto Layout?如何使用自动布局动态更改 UITableViewCell 的高度?
【发布时间】: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。这通常可以解决问题。
  • 你最终发现了吗?这里的所有答案都是为了初始化,而不是在旅途中更新它,这是您(和我)需要的。有什么发现吗?

标签: ios objective-c uitableview autolayout


【解决方案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];
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 1970-01-01
      • 2014-08-02
      • 2017-11-18
      • 1970-01-01
      • 2015-01-21
      • 2015-01-19
      • 2013-12-20
      • 2021-10-12
      相关资源
      最近更新 更多