Ios NSLayoutConstraints在第一次tableview演示后更新 我从xib加载自定义的UITableViewCell 我在中以编程方式更新NSLayoutConstraint cellforrowatinexpath

Ios NSLayoutConstraints在第一次tableview演示后更新 我从xib加载自定义的UITableViewCell 我在中以编程方式更新NSLayoutConstraint cellforrowatinexpath,ios,objective-c,uitableview,autolayout,nslayoutconstraint,Ios,Objective C,Uitableview,Autolayout,Nslayoutconstraint,自动布局和手动更改NSLayoutConstraint的功能正常-设备大小、方向等 但是:在第一次显示单元格时,不会显示编程更改。 按预期更改视图并返回更新 我想我需要把[self-setNeedsUpdateConstraints]放在某个地方。 我尝试了各种各样的地方(查看显示,显示单元格…) 这个应该放在哪里 这可能是新单元/重用单元问题吗?您已经更新(修改)了约束,因此视图不需要更新约束。它需要的是更新布局以响应约束更改。因此,我认为您需要执行[view setNeedsLayout]。

自动布局和手动更改
NSLayoutConstraint
的功能正常-设备大小、方向等

但是:在第一次显示单元格时,不会显示编程更改。
按预期更改视图并返回更新

我想我需要把
[self-setNeedsUpdateConstraints]
放在某个地方。
我尝试了各种各样的地方(
查看显示,显示单元格…

这个应该放在哪里

这可能是新单元/重用单元问题吗?

您已经更新(修改)了约束,因此视图不需要更新约束。它需要的是更新布局以响应约束更改。因此,我认为您需要执行
[view setNeedsLayout]
。应在添加了约束的视图(或修改的约束中涉及的所有视图的公共祖先视图)上执行此操作。它应该在修改约束的同一代码中完成,就在修改约束之后


也就是说,我不确定
-tableView:cellforrowatinexpath:
是否是尝试修改所返回视图的约束的好地方。此时,单元格视图尚未添加为表的子视图。只能为同一视图层次结构中的视图添加约束。

子类
UITableViewCell
并在
awakeFromNib:
中调用
setNeedsLayout


您还可以将更新约束移动到单元格的
updateConstraints
方法,使
UITableViewController
稍微小一些。毕竟,单元格是一个独立的
UIView
,它应该知道如何布局自己,而不是如何布局表视图控制器

从你的问题中,我得到的是

如果您可以使用pin从故事板向对象提供约束,则它将为对象设置这些约束,如果您在“CellForRowatineXpath:”中以编程方式添加约束,则它将在故事板中设置的约束之上设置右键。您可能错误地只为单个单元格设置了它们,所以它可能在单个单元格中显示效果

请您尝试一下下面的解决方案,并检查它是否对您有帮助。将此代码放入cellForRow方法中

我已经实现了

NSDictionary *viewsDictionary = @{@"redView":cell.lblText};
    NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(10)]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];

    NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView(100)]"
                                                                    options:0
                                                                   metrics:nil
                                                                   views:viewsDictionary];

    [cell addConstraints:constraint_H];
    [cell addConstraints:constraint_V];
在cellForRowAtIndexPath中:

它会影响单元格中的所有行,并且会超出约束

您也可以访问此链接以获取更多参考:

总之,为了每次都能获得良好的视图布局,我做了以下工作:

UIView现在自行负责,不会在tableviewController中乱来

我不需要在任何有意义的地方调用(void)updateConstraint,因为我在IB中设置了约束,只添加了一个属性来更改常量。实际的约束保持不变,只是需要布局

  • 将所有布局代码移动到我的UITableViewCell子类中,命名为它(void)UpdateMedia(只有两行代码)
  • 创建一个属性,将重新计算标签位置所需的信息(基本浮点)传递到子类中
  • 在UITableViewCell子类的(void)布局子视图中使用(void)updateMedian来更新我的坐标
  • 还在我的子类中的(void)prepareforuse中添加了对(void)updatemedia和[self layoutifneed]的调用
  • 增加了[cell setNeedsLayout];我的tableviewController中cellForRowAtIndexPath中的[单元格布局需要]

  • 我想,最后一步会造成一些冗余。但除此之外,仍有一些单元格显示不正确。

    我已经创建了UITableViewCell子类。您将代码移动到实际视图的建议非常有意义。在执行此操作时,我发现了实际问题:约束计算取决于标签的frame.width。标签的文本是在CellForRowatineXpath中设置的。因此,情况如下:1)新单元格:调用updateConstraints-错误的label.width 2)单元格重用:prepareForReuse-正确的label.width。我会再试一次,然后回来报告!你是对的,我将约束修改移动到视图本身(参见下面的注释)并解决了问题…我实际上为约束创建了一个IBOUTLET属性,因此不应该有冲突。