将自动布局约束常量 X 动画到父视图的中心

4
我会尽力为您提供简短详细的翻译,以下是需要翻译的内容:

我将简要介绍一下我目前所做的事情:

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轴上居中的正确方法是什么?


对我来说,发生的事情与预期发生的事情不太清楚。通常我会猜测将约束常量设置为0会使中心对齐! - luk2302
已经是0了 @luk2302,我添加了图片,请查看。 - Roi Mulia
我知道,这就是为什么我不明白你实际上想要实现什么以及发生了什么。尝试包括整个设备屏幕的截图,这样几何形状就清晰可见,并且更容易看出某些东西的行为不正确。 - luk2302
@luk2302 已更新 :) 谢谢 - Roi Mulia
2个回答

4
你正在做的事情是完全正确的。你有一个约束将一个视图的中心固定到另一个视图的中心。如果该约束的乘数为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图,展示了动画效果居中显示:

图片描述


感谢您的回复,先生。您提出的建议是一个很好的解决方案,但我仍然想找到通过常量动态地实现它的方法。我们有机会解决这个问题吗? :) - Roi Mulia
1
你“自己想办法吧”。如果你想通过常量来实现动画效果,你应该从一个常量非零的约束开始,而不是从一个乘数非一的约束开始。但是你从乘数开始,既然如此,我的答案告诉你如何才能得到你想要的结果。我提供了示例代码和演示视频,证明它可以工作。这就是我所能做的。接受或离开都行。 - matt
我不知道那是什么意思。你可以“看到”代码。你知道所有需要知道的东西。 - matt
我的意思是,如果我设置了一个与1不同的乘数,就像我上面所做的那样。当我尝试更改常量时,如果乘数不是1,常量会表现得不同吗? - Roi Mulia
让我们在聊天中继续这个讨论 - Roi Mulia
显示剩余5条评论

1

已解决。尽管@matt给出了很好的答案(并且起作用),但我提问的主要目的是处理约束常量以将其居中于X轴上。根据可能向我展示的公式:

**a1 = m*a2 + c**

我深入研究了一下,理解了几个要点: 最终我需要第二个属性(a2 - button.center.x)与第一个属性(a1 - self.view.center.x)在同一位置。 因此,a1 = a2 = self.view.center.x。 我的乘数等于3(m - multiplier)。至于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
@Crashalot 谢谢,很高兴我能帮到你! - Roi Mulia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接