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