暂时删除NSLayoutConstraint?

Luk*_*uke 5 objective-c uitableview ios autolayout

我有一个UITableViewCell使用AutoLayout布局的子类,我想要一个小动画,其中图像视图转换,增长一点并缩小.

目前,由于受到限制,图像右侧的标签也在移动(应该如此).

我想要一种快速简便的方法暂时说"在这个动画运行时将这些标签保留在当前状态".这是我可以做的事情,而不需要删除和重新添加这些约束,这是很麻烦的?

Fir*_*iro 5

从iOS 8开始,NSLayoutConstraints现在有一个active可以更改的属性myConstraint.active = NO;.这将删除约束,而将此值设置为YES[re]添加它:

激活或取消激活约束会调用addConstraint:和removeConstraint:在视图上,该视图是此约束管理的项目的最近共同祖先.使用此属性而不是直接调用addConstraint:或removeConstraint:. 资源

另外,有两个新的类方法activateConstraints:,deactivateConstraints:它们采用一系列约束(NSArray<NSLayoutConstraint>),这样可能会有所帮助,特别是如果你有一个IBOutletCollection约束.

[NSLayoutConstraint deactivateConstraints:myConstraints];


Jes*_*sak 1

没有 API 可以说“将这些视图保留在此处”,从而暂时禁用自动布局的某些部分。有几种可能的解决方案:

  • 消除动画过程中的限制
  • 以不同的方式安排您的约束(例如,使它们成为图像视图的超级视图,或者让它们仅依赖于图像视图的中心)
  • 覆盖容器视图的layoutSubviews,以在自动布局运行后将标签粘贴回您想要的位置[super layoutSubviews](或删除图像视图的转换,运行自动布局,然后将其放回去)
  • 子类化您的图像视图并覆盖frameForAlignmentRect:,并alignmentRectForFrame:获得自动布局以使用未转换的框架进行对齐。

更多详细信息和建议可在此处的答案中找到,这是一个类似的如何使变换和自动布局一起发挥作用的问题:How do I adjustment theanchor point of a CALayer, when Auto Layout is being using?