我设置了一个动画,以在打开另一个开关/标签时隐藏它。同时,刚刚打开的开关向上移动。简单的解释here可以很好地工作。

但是,当我尝试在关闭开关后将其向下移动时,它不会退缩。另一个开关重新显示正常,但最高约束更改不会触发。

我相对较不熟悉这种类型的设置,并以编程方式为所有动画设置动画,花了一个小时后才感到困惑。是因为我要设置相对于另一个约束的最大约束?如果它第一次起作用,那有什么关系?即使隐藏开关的alpha设置为零,它的框架仍然存在,对吗?还是我在愚蠢地做一些简单的事情?

// Works Perfectly!

func hideVeg() {

    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
        self.vegetarianSwitch.alpha = 0
        self.vegetarianLabel.alpha = 0
        self.veganSwitch.topAnchor.constraint(equalTo: self.vegetarianSwitch.bottomAnchor, constant: -30).isActive = true
        self.view.layoutIfNeeded()
    })
}

// Showing the label and switch works, but the topAnchor constraint never changes!

func showVeg() {

    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
        self.vegetarianSwitch.alpha = 1
        self.vegetarianLabel.alpha = 1

        // This is the constraint that doesn't change.
        // This is exactly what it was set to before the other hideVeg() runs.
        self.veganSwitch.topAnchor.constraint(equalTo: self.vegetarianSwitch.bottomAnchor, constant: 40).isActive = true
        self.view.layoutIfNeeded()
    })
}

最佳答案

这里的问题是您不是在修改约束,而是实际上为每个动画创建新的约束。相反,您要做的只是创建一次约束(您可以在代码中或在Interface Builder中进行创建,然后拖动并退出)。然后,您可以只更改动画块中现有约束的.constant字段。

10-08 06:07
查看更多