uistackview "jumps"中排列子视图中的动画



我有一个水平UIStackView,其中包含几个排列的子视图。

当用户单击按钮时,我想删除一个排列的子视图(我们称之为 A),但在此之前我想做一个快速动画。我想做我自己的动画,所以我不能只制作动画stackView.removeArrangedSubview这将做一个默认的基本动画,而不是我想要的特殊动画。

在 A 中,我有另一个视图(我们称之为 B),它是 centeredX 和使用自动布局的 centeredY。

当我将排列的子视图 A 的 A.widthAnchor.常量动画化为 0 时,其他arrangedsubviews逐渐取代它的位置时,子项 B 在动画其 CenterX 之前丢失并转到左侧。或者也许它不会丢失 centerX,但它在一个小 A 上居中 X(宽度 = 0,从左侧开始),但 A 不应该立即将其宽度设置为 0,但在动画完成后......

我尽量解释清楚,但我知道这可能会令人困惑。这是显示问题的视频。在动画开始之前,位于arrangedsubviewA(全屏)中的图像 (B) 在左侧"跳跃"。

https://drive.google.com/open?id=1nTDRe5zirbuQi86WVBTuU-iDU8aq0lcw

这是我制作此动画的非常简单的代码:

UIView.animate(withDuration:4,delay:0, options:.curveEaseInOut, animations : {
self.c.constant = 0 // c is A.widthAnchor constraint
self.stackView.layoutIfNeeded()
},completion: { _ in
// done
})

我发现自己: 实际上,问题是当我这样做时

Stackview.layoutIfNeeded()

堆栈视图中的内容可以动画化,但堆栈视图本身不能。因此,堆栈视图在动画开始之前更新了其宽度。 我刚刚改为

superviewThatContainTheStackView.layoutIfNeeded()

所以现在一切正常:)

最新更新