UITableViewCell
NSLayoutConstraint
cellForRowAtIndexPath
NSLayoutConstraint
的Autolayout和手动更改可以正常工作 - 设备大小,方向等。
但是:在第一次显示单元格时,不会显示程序更改 按预期更改视图并返回更新。
我相信我需要把[self setNeedsUpdateConstraints]
放在某处
我尝试过各种各样的地方(viewDidAppear, didEndDisplayingCell ...
)
这应该去哪儿?
它可能是新的细胞/重复使用的细胞问题吗?
答案 0 :(得分:2)
所以,总结一下 - 这就是我为了每次都得到精美的观点而做的事情:
UIView现在负责自己,在tableviewController中没有搞乱。
我不需要在任何有意义的地方调用(void)updateConstraints,因为我在IB中设置了约束并且只添加了一个属性以便能够更改常量。实际的约束条件保持不变,只需要布局!
我猜,最后一步会产生一点冗余。但是否则仍有一些细胞显示不正确。
答案 1 :(得分:0)
您已经更新(修改)了约束,因此视图不需要更新其约束。它需要的是更新其布局以响应约束变化。所以,我认为你需要做[view setNeedsLayout]
。应该在添加约束的视图上进行(或者修改约束中涉及的所有视图的共同祖先视图)。它应该在修改约束的相同代码中完成,只需在修改它之后。
那就是说,我不确定-tableView:cellForRowAtIndexPath:
是否是尝试修改被返回视图的约束的好地方。此时,单元格视图尚未添加为表格的子视图。只能为同一视图层次结构中的视图添加约束。
答案 2 :(得分:0)
子类UITableViewCell
并在setNeedsLayout
中致电awakeFromNib:
。
您还可以将更新约束移动到单元格的updateConstraints
方法,使UITableViewController
更小一些。毕竟,单元格是一个单独的UIView
,它应该知道如何布局自己,而不是表视图控制器。
答案 3 :(得分:0)
从你的问题我得到的是
如果您可以使用pin从storyboard中为对象提供约束,那么它会将这些约束设置为对象,如果您在“cellForRowAtIndexPath:”中以编程方式添加了约束,它将超过您在故事中设置的约束板。您可能只是为了单个单元格而错误设置它们,因此可能会在单个单元格中显示效果。
您可以尝试以下解决方案并检查它是否对您有所帮助。将此代码放在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];
in cellForRowAtIndexPath:
它影响了单元格中的所有行,并且它超出了约束条件。
您还可以访问此链接以获取更多参考: http://technet.weblineindia.com/mobile/ui-design-of-ios-apps-with-autolayout-using-constraints-programmatically/ http://www.thinkandbuild.it/learn-to-love-auto-layout-programmatically/