uistackview 中排列的子视图内的动画“跳跃”

Jer*_*kar 1 animation ios swift uistackview

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

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

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

当我将安排的子视图 A 的 A.widthAnchor.constant 设置为 0 时,其他视图arrangedsubviews逐渐取代它,子视图 B 在动画之前丢失其 CenterX 并向左移动。或者也许它不会失去centerX,但它是在一个小A上的centeredX(其宽度= 0,并从左侧开始),但A不应该立即将其宽度设置为0,而是在动画完成之后.. 。

我尽力解释清楚,但我知道这可能会令人困惑。这是显示问题的视频。A中的图像 (B) arrangedsubview(占据整个屏幕)在动画开始之前“跳”到左侧。

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
    })
Run Code Online (Sandbox Code Playgroud)

Jer*_*kar 7

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

Stackview.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

stackview 内部的内容可以进行动画处理,但 stackview 本身不能进行动画处理。因此 stackview 在动画开始之前更新了它的宽度。我刚刚更改为

superviewThatContainTheStackView.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

所以现在一切正常了:)