当没有高度约束时,使用autolayout动画化视图的高度

时间:2015-02-23 01:13:04

标签: ios autolayout constraints

我有一个观点(让我们称之为" contentView")它的高度由其子视图决定,主要是UILabels。

UILabels内容是动态的,可能会在运行时增长或缩小。 UILabels的numberOfLines = 0,没有高度约束,允许它们的高度随内容增长。

UILabels对其邻居和/或superview有0个前导/尾随/上/下约束,如下所示:

enter image description here

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

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

另请注意,在制作动画时,如果下面还有其他视图" contentView"他们需要进入空位(并在再次按下按钮时向后移动)。

似乎最自然的动画是将contentView的高度更改为0,同时在contentView下动画制作视图(反向动画将高度更改回原始高度)。

有关如何为contentView的高度设置动画的任何建议吗?

2 个答案:

答案 0 :(得分:1)

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

约束在动画时改变布局,我需要相反的效果 - 在动画进行过程中布局必须保持固定。 所以我禁用了动画持续时间的约束,这似乎运作良好。

完整的食谱是:

我在contentView上禁用了约束:

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

CGRect frame = view.frame;
frame.size.height = 0;
[[view superview] layoutIfNeeded];
[UIView animateWithDuration:0.5 animations:^{
    view.frame = frame;
    [[view superview] layoutIfNeeded];
}];

我还必须更改子视图的一些属性才能使它们正确动画(可能不需要此步骤。这取决于子视图的基本布局):

for UITextView: scrollEnabled = YES
for UIButton: clipsToBounds = YES

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

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

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

答案 1 :(得分:0)

是:添加constant为0的高度约束。

您可以使用deactivateConstraints()暂时停用可能与此相冲突的其他约束,并activateConstraints()重新启用它们。

您可以通过编程方式将相关约束放在数组中,或者如果您正在使用故事板,则可以使用插座集合。