第一次tableview演示后,NSLayoutConstraints更新

时间:2014-09-13 06:54:37

标签: ios objective-c uitableview autolayout nslayoutconstraint

  1. 我从xib
  2. 加载自定义UITableViewCell
  3. 我以编程方式更新NSLayoutConstraint cellForRowAtIndexPath
  4. NSLayoutConstraint的Autolayout和手动更改可以正常工作 - 设备大小,方向等。

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

    我相信我需要把[self setNeedsUpdateConstraints]放在某处 我尝试过各种各样的地方(viewDidAppear, didEndDisplayingCell ...

    这应该去哪儿?

    它可能是新的细胞/重复使用的细胞问题吗?

4 个答案:

答案 0 :(得分:2)

所以,总结一下 - 这就是我为了每次都得到精美的观点而做的事情:

UIView现在负责自己,在tableviewController中没有搞乱。

我不需要在任何有意义的地方调用(void)updateConstraints,因为我在IB中设置了约束并且只添加了一个属性以便能够更改常量。实际的约束条件保持不变,只需要布局!

  1. 将所有布局代码移动到我的UITableViewCell子类,命名为(void)updateMedian(只需两行代码)。
  2. 建立一个属性来传递重新计算标签位置到子类所需的信息(基本浮点数)。
  3. 使用(void)updateMedian in(void)layoutUubableViewCell子类的子视图来更新我的坐标。
  4. 还在我的子类中的(void)prepareForReuse中添加了对(void)updateMedian和[self layoutIfNeeded]的调用。
  5. 添加[cell setNeedsLayout];我的tableviewController中的cellForRowAtIndexPath中的[cell layoutIfNeeded]。
  6. 我猜,最后一步会产生一点冗余。但是否则仍有一些细胞显示不正确。

答案 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/