我有一个观点(让我们称之为" contentView")它的高度由其子视图决定,主要是UILabels。
UILabels内容是动态的,可能会在运行时增长或缩小。 UILabels的numberOfLines = 0,没有高度约束,允许它们的高度随内容增长。
UILabels对其邻居和/或superview有0个前导/尾随/上/下约束,如下所示:
结果是contentView的高度等于其所有子UILabel的总高度(其高度由其文本的高度决定)。
我现在需要在按下按钮时隐藏contentView(再次按下该按钮时再次显示)。
另请注意,在制作动画时,如果下面还有其他视图" contentView"他们需要进入空位(并在再次按下按钮时向后移动)。
似乎最自然的动画是将contentView的高度更改为0,同时在contentView下动画制作视图(反向动画将高度更改回原始高度)。
有关如何为contentView的高度设置动画的任何建议吗?
答案 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()
重新启用它们。
您可以通过编程方式将相关约束放在数组中,或者如果您正在使用故事板,则可以使用插座集合。