暂时移除 NSLayoutConstraint?

Posted

技术标签:

【中文标题】暂时移除 NSLayoutConstraint?【英文标题】:Temporarily remove NSLayoutConstraint? 【发布时间】:2014-07-07 10:37:58 【问题描述】:

我有一个使用 AutoLayout 布局的 UITableViewCell 子类,我想要一个小动画,其中图像视图会发生变换、增长一点并缩小。

目前,由于限制,图像右侧的标签也在移动(应该是)。

我想要一种快速简单的方法来临时说“在动画运行时将这些标签保留在它们当前所在的位置”。是不是我不需要删除和重新添加那些很麻烦的约束就可以做到这一点?

【问题讨论】:

【参考方案1】:

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

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

此外,还有两个新的类方法 activateConstraints:deactivateConstraints: 采用一组约束 (NSArray<NSLayoutConstraint>),这会很有帮助,尤其是当您有一个带有约束的 IBOutletCollection 时。

[NSLayoutConstraint deactivateConstraints:myConstraints];

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

这是一个很好的答案,但幸运的是我不需要它。我使用CABasicAnimation 代替 UIView 动画,因为它们不会触发布局更改。 @lukech 这是一种选择,但要小心,如果在你的动画过程中有任何其他因素会导致布局,你会回到你开始时的同一个错误。

以上是关于暂时移除 NSLayoutConstraint?的主要内容,如果未能解决你的问题,请参考以下文章

暂时移除假冒

iOS 14 并未移除 3D Touch 功能,苹果官方:暂时不可用

iOS 14移除3D Touch?苹果:暂时不可用!

如何将 swift NSLayoutConstraint activateConstraints 转换为目标 c?

MVC 3.0错误 HTTP 404您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。

由于 NSLayoutConstraint 错误,具有 automaticDimension 的 UITableView 不会动态增加大小