Ios 设置视图动画';当有';没有高度限制

Ios 设置视图动画';当有';没有高度限制,ios,autolayout,constraints,Ios,Autolayout,Constraints,我有一个视图(我们称之为“contentView”),它的高度由它的子视图决定,而子视图主要是UILabel UILabels内容是动态的,在运行时可能会增长或收缩。 UILabels的numberOfLines=0,并且没有高度约束,这允许其高度随内容而增长 UILabel对其邻居和/或superview具有0个前导/尾随/顶部/底部约束,如下所示: 结果是contentView的高度等于其所有子UILabel的总高度(其高度由其文本的高度确定) 我现在需要在按下按钮时隐藏contentVi

我有一个视图(我们称之为“contentView”),它的高度由它的子视图决定,而子视图主要是UILabel

UILabels内容是动态的,在运行时可能会增长或收缩。 UILabels的numberOfLines=0,并且没有高度约束,这允许其高度随内容而增长

UILabel对其邻居和/或superview具有0个前导/尾随/顶部/底部约束,如下所示:

结果是contentView的高度等于其所有子UILabel的总高度(其高度由其文本的高度确定)

我现在需要在按下按钮时隐藏contentView(并在再次按下按钮时再次显示)

还请注意,在设置动画时,如果“contentView”下面有其他视图,则它们需要移入以占据空白空间(再次按下按钮时移回)

看起来最自然的动画是将contentView的高度更改为0,同时向上设置contentView下视图的动画(反向动画将高度更改回其原始高度)


关于如何设置contentView高度的动画有什么建议吗?

是:添加一个高度约束,其
常量为0

您可以使用
activateConstraints()
临时禁用可能与此冲突的其他约束,并使用
activateConstraints()
重新启用它们


您可以通过编程方式将相关约束放入数组中,如果您使用的是故事板,则可以使用outlet集合。

不幸的是,我无法为该布局创建足够平滑的动画,但我找到了一个解决方法

设置动画时,约束会更改布局,我需要的是相反的效果-在动画进行期间,布局必须保持固定。 因此,我在动画持续时间内禁用了约束,这似乎效果很好

完整的配方是:

我禁用了contentView上的约束:

contentView.translatesAutoresizingMaskIntoConstraints = YES
然后我做了一个简单的帧动画。我确保在superview上调用LayoutIfNeed以确保contentView下的视图在动画期间向上移动:

CGRect frame = view.frame;
frame.size.height = 0;
[[view superview] layoutIfNeeded];
[UIView animateWithDuration:0.5 animations:^{
    view.frame = frame;
    [[view superview] layoutIfNeeded];
}];
我还必须更改子视图的某些属性以使其正确设置动画(可能不需要此步骤。这取决于子视图的基本布局):

在动画结束时,在“完成”块上,我将contentView.TranslatesAutoResizezingMaskinToConstraints设置回“否”,并恢复了子视图属性:

for UITextView: scrollEnabled = NO
for UIButton: clipsToBounds = NO

(我最终使用UITextView而不是UILabels,因为我需要文本可选择。然后我将scrollEnabled设置为NO,以根据文本内容调整文本视图的大小)。

感谢快速响应,但是当我添加0高度约束时,动画很奇怪。它分别收缩每个子视图的高度,同时收缩整个contentView。我正在寻找一个更平滑的动画效果,其中整个视图会像使用单个高度约束一样收缩。此外,禁用约束只会使所有子视图向上移动到顶部。相反,我只是创建了一个具有“必需”优先级的高度约束,使所有子视图在这个(奇怪的)动画结束时消失。Objective-C或Swift?这个项目在Objective C中,但Swift也可以。
for UITextView: scrollEnabled = NO
for UIButton: clipsToBounds = NO