隐藏对象的NSLayoutConstraint仍然会覆盖备用约束

Dea*_*ids 1 ios6 nslayoutconstraint

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

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

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

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

即使图像被隐藏,标签仍会被第一个约束缩短.这是预期的行为吗?我通常会在运行时计算和更改标签的宽度,但这似乎是NSLayoutConstraints的用途.

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

Val*_*hie 8

从NSLayoutConstraint的类引用中,一旦约束被放置,就不允许更改约束的优先级.并且更高优先级的约束将始终覆盖较低的约束.

约束可以被删除并添加回来.如果约束是通过故事板或IB进行的,那么您可以创建一个NSLayoutConstraint的IBOutlet并将其连接起来.

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

然后,如果隐藏图像,则可以删除第一个约束,并且将发生第二个约束.

[self.view removeConstraint:self.firstConstraint];
Run Code Online (Sandbox Code Playgroud)

删除约束后,可能需要调用layoutIfNeeded.


GK1*_*100 5

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

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

[self.firstConstraint setActive:NO];