将自动布局约束常量X设置为父视图的中心

时间:2015-05-19 18:36:43

标签: ios animation constants center nslayoutconstraint

我会简短而详细地为您服务。 到目前为止我所取得的成就:

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

enter image description here

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

            })

问题:

对象的来源位置:

enter image description here

而不是将视图设置为中心X的动画,如下所示:

enter image description here

由于某种原因它向左边动画,这就是结果:

enter image description here

我希望我很清楚。谢谢你的时间。

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

2 个答案:

答案 0 :(得分:3)

你想要做的是完全正确的。您有一个约束将一个视图的中心固定到另一个视图的中心。如果该约束的乘数为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,向中心显示结果动画:

enter image description here

答案 1 :(得分:1)

解决。 尽管@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()

            })

希望有所帮助。和亚光感谢指示!