当前位置: 首页 > 知识库问答 >
问题:

动画约束相对于另一个约束

鲜于光赫
2023-03-14

我设置了一个动画,以在打开另一个开关/标签时隐藏一个开关/标签。同时,刚刚打开的开关向上移动。这里的简单解释非常有效。

但是,当我在开关/标签关闭后尝试向下移动时,它不会移动。另一个开关会很好地重新出现,但不会触发顶部约束更改。

我对这种类型的设置和动画都是以编程方式进行的相对较新,在花了一个小时之后,我被难住了。是因为我正在制作相对于另一个顶部约束的动画吗?如果它第一次工作,这有什么关系?即使隐藏开关的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()
    })
}

共有2个答案

罗波鸿
2023-03-14

常量需要随着动画而改变,而不是创建一个全新的约束。旧的约束仍然存在,导致了这个问题。

var veganTopConstraint = NSLayoutConstraint()

// Top Constraint set up this way so it can be animated later.
veganTopConstraint = veganSwitch.topAnchor.constraint(equalTo: vegetarianSwitch.bottomAnchor, constant: 40)
veganTopConstraint.isActive = true


func hideVeg() {

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

        self.veganTopConstraint.constant = -30

        self.view.layoutIfNeeded()
    })
}

func showVeg() {

    self.view.layoutIfNeeded()

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

        self.veganTopConstraint.constant = 40

        self.view.layoutIfNeeded()
    })
}
艾晋
2023-03-14

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

 类似资料:
  • 我有一个UIImageView,我想在背景上用平移效果慢慢动画。我的背景图像视图有四个约束: 从顶部到顶部布局指南的距离(零) 图像视图的视图模式设置为“纵横比填充”。当我运行我的应用程序时,没有问题,会显示静态图像。我添加以下代码来设置视图的动画: 然后我调用[self-AnimateBackground Horizontal:YES] 视图将显示:。发生的情况如下: 图像从一个意外(但始终相同

  • 问题内容: 我有一个UITextField我想在点击时扩大它的宽度。我设置了约束,并确保左侧的约束的优先级低于我要尝试在右侧进行动画的优先级。 这是我尝试使用的代码。 这可行,但是似乎只是瞬间发生,似乎没有任何动作。我尝试将其设置为10秒以确保没有遗漏任何东西,但得到的结果相同。 nameInputConstraint是我控制拖动以从IB连接到我的类的约束的名称。 谢谢您的帮助! 问题答案: 您需

  • 在我的应用程序中,我正在为视图的高度约束设置动画,当高度约束更改时,视图会向下平移一段时间,尽管我将约束设置为0。下面是我用来设置更改动画的代码: 下面是创建所有可扩展视图的方法: 对我来说,问题不在于如何设置高度变化的动画,因为这是可行的,而在于解决一个事实,即在一段时间内,应用程序似乎忽略了顶部的约束。这是显示动画的gif

  • 虽然有几个问题的答案与我的相似,但似乎没有一个能解决我的困境。我有一个图像视图,我可以通过改变水平和垂直约束来移动它,并使用长按手势在屏幕上移动。如果这张图像没有移动一定的距离,我希望它能动画化回到原来的位置。我正在使用以下代码示例来尝试执行此操作: 和在其他地方定义为用户单击的位置 和定义为用户在超级视图中的位置 不用说,平移图像时,一切都正常。它会拖动,然后在手势结束时停止。问题是,如果用户没

  • 我正在用更新一个旧的应用程序,当没有广告时,它就会滑出屏幕。当有广告时,它会在屏幕上滑动。基本的东西。 老风格,我设置了一个动画块的框架。新样式中,我有一个到auto-layout约束,它确定位置,在本例中是距离超级视图底部的距离,并修改常数: 和预期的一样,但没有动画。 更新:我重新观看了WWDC12讨论的最佳实践,以掌握自动布局,其中包括动画。它讨论了如何使用CoreAnimation更新约束