UIStackView 子视图仅在 isHidden 设置为 false 时才动画

Posted

技术标签:

【中文标题】UIStackView 子视图仅在 isHidden 设置为 false 时才动画【英文标题】:UIStackView subviews animating only when isHidden is set to false 【发布时间】:2019-07-25 08:53:30 【问题描述】:

我正在尝试在动画块中隐藏/显示UIStackView 的子视图,如下所示:

UIView.animate(withDuration: 0.3) 
   self.unpairSensorButton.isHidden = isHidden

显示动画效果很好,但是当我尝试隐藏它时,它只是等待动画持续时间然后立即消失。知道为什么吗?

我曾尝试使用 layoutIfNeeded() 并将其放入 DispatchQueue.main.async 块机器人中,但均无济于事。

【问题讨论】:

您预计会发生什么?你预计它会淡出吗? 这是一个垂直的堆栈视图,所以我希望它会出现在与显示相反的动画中。但它只是突然消失了。 我仍然没有得到你想要发生的事情。如果要淡入,请将 alpha 设置为 1。如果要使其淡出,请将 alpha 设置为 0。isHidden 不可动画。 当然是动画的。这就是为什么当我将 isHidden 设置为 true 时它会动画。 所以它有效?那你的代码有什么问题? 【参考方案1】:

isHidden 属性本身不可动画。 UIStackView 基本上会在您隐藏某些子视图时更改其内部约束以适应其大小。由于约束是可动画的,您可以这样做:

unpairSensorButton.isHidden = isHidden
UIView.animate(withDuration: 0.3) 
   self.view.layoutIfNeeded()

在动画块中调用layoutIfNeeded() 将使布局过程动画化。

【讨论】:

这基本上是不正确的,因为 UIStackView 观察者视图并应用动画monosnap.com/file/UyMyLFJESMYLf0Tn8PLjJLGw3X760n

以上是关于UIStackView 子视图仅在 isHidden 设置为 false 时才动画的主要内容,如果未能解决你的问题,请参考以下文章

子视图的 UIStackView 不滚动

为啥 UIStackView 调整排列的子视图的大小?

获取 UIStackView 子视图的框架

UIStackView:内部子视图的破坏约束

为啥 UIStackView 不堆叠 UILabel 安排的子视图?

UIStackView,通过调整动画大小隐藏子视图