1

我只是第一次尝试在笔尖中使用自动布局。看来我的情况是教科书的情况,这NSLayoutConstraints将是完美的解决方案。

我旁边有一个UITableviewCellwith和一个图像。UILabel图像根据底层数据的属性而变化,它可以改变大小,有时会被隐藏。我的目的是让标签与图像保持一定距离,并在图像隐藏时跨越整个单元格。

我相应地在标签上设置了约束:

  • 一个约束,后缘距图像前缘一定距离,高优先级但不是必需的。
  • 一个约束,后缘与超级视图边缘有一定距离,优先级低得多。
  • 适当的左侧和顶部约束,对标签的宽度没有约束。

标签仍然被第一个约束缩短,即使图像被隐藏。这是预期的行为吗?我通常会在运行时计算并更改标签的宽度,但这似乎正是 NSLayoutConstraints 所针对的那种情况。

当图像不可见时,如何让它忽略对图像的约束?

4

2 回答 2

8

从 NSLayoutConstraint 的类引用来看,一旦约束被放置,就不允许改变约束的优先级。并且较高优先级的约束总是会覆盖较低的。

可以删除和添加约束。如果约束是通过情节提要或 IB 放置的,您可以制作 NSLayoutConstraint 的 IBOutlet 并连接它。

如果您使用自动为 IBOutlet 生成代码行的 Xcode 功能,它会将 IBOutlet 声明为弱。如果您要在将来删除约束后的某个时间重新添加约束,则需要将其更改为强。这是为了避免约束在被移除后被释放。

然后,如果图像被隐藏,您可以删除第一个约束,然后将发生第二个约束。

[self.view removeConstraint:self.firstConstraint];

您可能需要在移除约束后调用 layoutIfNeeded。

于 2013-06-06T10:55:32.583 回答
5

使用 ios 8,您可以激活/停用约束 ( https://developer.apple.com/library/ios/releasenotes/General/iOS80APIDiffs/frameworks/UIKit.html ):

我将创建 2 个约束,一个具有较低优先级,并在隐藏视图时停用较高优先级的约束,并在视图再次可见时重新激活它:

[self.firstConstraint setActive:NO];

于 2014-11-05T16:38:13.780 回答