【问题标题】:Animate auto-layout constraint constant X to the center of the parent view动画自动布局约束常量 X 到父视图的中心
【发布时间】:2015-07-31 17:57:32
【问题描述】:

我会简短而详细地为您介绍。 到目前为止我所做的成功:

1) 我为所需的约束(中心 X 对齐)创建了一个出口。我不知道这是否重要,但我根据需要更改了乘数(3:1)

2)动画他的常量

UIView.animateWithDuration(0.5, animations: { () -> Void in

   self.btn_option_layout.constant = self.nan_view.center.x //Get center x value
   self.nan_view.layoutIfNeeded() // Parent View

            })

问题:

对象的源位置:

而不是像这样将视图动画到中心 X:

出于某种原因,它使他向左移动,这就是结果:

我希望我已经足够清楚了伙计们。感谢您的宝贵时间。

计算约束常数以使其在 X 上居中的正确方法是什么?

【问题讨论】:

  • 至少对我来说,目前尚不清楚正在发生的事情与您期望发生的事情相反。通常我会猜测将约束常数设置为 0 会对齐中心!
  • 已经是0了@luk2302,我加了图片,看看
  • 我知道,这就是为什么我不明白你真正想要实现的目标以及正在发生的事情。尝试包括整个设备屏幕的屏幕截图,这样几何图形清晰,并且可以更好地看到某些行为不正确。
  • @luk2302 已更新 :) 谢谢

标签: ios animation constants center nslayoutconstraint


【解决方案1】:

您正在尝试做的事情是完全正确的。您有一个约束将一个视图的中心固定到另一个视图的中心。如果该约束的乘数为 1,则该视图将位于另一个视图的中心。

但是您的乘数不是 1。而且,正如您正确观察到的,您不能更改现有约束的乘数 - 它是只读的。

但是,没问题。只需用一个不同的 约束替换整个约束,与第一个约束相同,除了它的乘数 1。现在动画布局!一个鲜为人知的事实是,您可以对这种约束变化进行动画处理。

这是实际代码:

let con2 = NSLayoutConstraint(item: self.con.firstItem, attribute: self.con.firstAttribute, relatedBy: self.con.relation, toItem: self.con.secondItem, attribute: self.con.secondAttribute, multiplier: 1, constant: 0)
NSLayoutConstraint.deactivateConstraints([self.con])
NSLayoutConstraint.activateConstraints([con2])
UIView.animateWithDuration(1, animations: {self.view.layoutIfNeeded()})

这是一个循环的 gif,将生成的动画显示到中心:

【讨论】:

  • 谢谢您的回复先生您的建议是一个很好的解决方案,但我仍然想通过常量找到动画的动态方式。我们有没有可能弄清楚? :)
  • 你“想办法”。如果您想通过常量对其进行动画处理,您应该从常量非零的约束开始,而不是乘数为非一元的约束。但是你从乘数开始,既然你这样做了,我的回答会告诉你要做什么才能得到你想要的结果。我提供了示例代码和证明它有效的电影。这就是我能做的。要么接受,要么离开。
  • 当你改变它时,乘数会影响常数吗?
  • 我不知道那是什么意思。您可以查看代码。你知道所有需要知道的。
  • 我的意思是,如果我设置不同于 1 的乘数,就像我上面所做的那样。而且我试图改变常数,当乘数不是 1 时,常数的行为会有所不同吗?
【解决方案2】:

解决了。 尽管@matt 很好的答案(和工作)。我的问题的主要目的是处理约束常量,以便将其集中在 X 上。 根据可能向我展示的公式:

**a1 = m*a2 + c**

我潜入了。我明白了几点: 最终我需要第二个属性(a2 - button.center.x)将在第一个属性(a1 - self.view.center.x)的相同位置。 所以a1 = a2 = self.view.center.x 我的乘数等于 3(m - 乘数)。还有 C.. 我们正在寻找它:) 所以让我们把它放在上面:

a1 = m*a2 + c
c = a1 - m* a2
c = self.view.center.x - 3 * self.view.center.x
c = -2 * self.view.center.x

代码:

 UIView.animateWithDuration(0.5, animations: { () -> Void in
                self.btn_option_layout.constant = -2 * self.nan_view.center.x
                self.nan_view.layoutIfNeeded()

            })

并将其反转回原来的位置:

代码:

UIView.animateWithDuration(0.5, animations: { () -> Void 
 self.btn_option_layout.constant = 0     
 self.nan_view.layoutIfNeeded()

            })

希望对您有所帮助。和马特谢谢你的指示!

【讨论】:

  • 谢谢,这很有帮助!没有意识到您可以更改 centerX 约束的常量值。
  • @Crashalot 谢谢,很高兴能为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
相关资源
最近更新 更多