应用约束时动画视图的正确方法是什么?

时间:2017-08-03 04:58:07

标签: ios swift animation

我必须为UIStoryboard中的UIViewController中添加的几个UIView设置动画。我已经附加了适当的约束,以便它们始终以我正在寻找的方式可见。这很好。

我正在使用https://github.com/satoshin21/Anima库来根据我的需要设置这些视图的动画。

但问题是他们没有像预期的那样工作,他们没有在应有的方向或位置上制作动画。我相信这是因为我已经应用了限制。

即使应用了约束,实现这一目标的最佳方法是什么?

设置,myView.translatesAutoresizingMaskIntoConstraints = true在控制台中会出现大量警告消息。

P.S。我知道以NSLayoutConstraints的形式引用约束,但这不是我所看到的,因为上面的库只提供了良好的链接函数,尽管我们可以在不引用约束的情况下完成它。

3 个答案:

答案 0 :(得分:0)

这里的问题是,NSLayoutConstraint切换就像属性一样工作,因为它们只是可以打开/关闭的值,并且通过玩这种切换和其他可能的值的其他可能值来交替。不幸的是,没有真正解决这个问题的方法,事实上我自己已经构建了一个类似于Anima的小型库,如果你尊重NSLayoutConstraints的性质,它的效果相当好。

证明这一点是在这个Anima库的引擎下,它只是存储在链内声明的动画点(事实上在Enum值内),并在动画移动时应用它们。无论如何,在使用NSLayoutConstraints时,不应该将translatesAutoResizingMaskIntoConstraints重新设置为true。 第二个原因是约束是所有iOS帧操作的基础,包括.frame和动画(这就是为什么Anima从它的外观上工作得很好)。 我最近写了post,但正如我通过引用Apple解释的那样:

  

你的问题是,当translatesAutoresizingMaskIntoConstraints是   调用,.frame或.frame.size等方法被忽略/覆盖   (取决于您何时或之后使用它们   translatesAutoresizingMaskIntoConstraints)。如Apple所述:

     

请注意,自动调整遮罩约束会完全指定视图   大小和位置;因此,您无法添加其他约束   修改此大小或位置而不引入冲突。如果你   想要使用自动布局来动态计算大小和位置   在您的视图中,您必须将此属性设置为false,然后提供一个   视图的非模糊,非冲突的约束集。

<强>已更新 否则,尽量不要使用这些视图将translatesAutoResizingMaskIntoConstraints设置为true,这样做基本上可以告诉控制器忽略您的约束,并尝试根据.frame或.frame.size或位置值设置应用约束在UIView上。因此,使您的自定义约束过时。如果通过停止此操作,您仍然会遇到问题,这可能是一个约束值问题,我不能在没有任何代码的情况下为您提供更多建议。

答案 1 :(得分:0)

首先,如果您已经在视图上设置了合适的约束,则不应将translatesAutoresizingMaskIntoConstraints设置为true。将此属性设置为true将为视图添加更多约束,从而导致冲突。

带约束的动画的一般代码是

aConstraint.constant = 1234
anotherConstraint.isActive = false
thirdConstraint.isActive = true // thirdConstraint replaces anotherConstraint
UIView.animatewithDuration: 0.25) {
    self.view.layoutIfNeeded()
}

希望这会有所帮助。 ;)

答案 2 :(得分:0)

我的解决方案是删除UIViewController的约束,并根据我的需要以编程方式设置框架。这很好用,不需要使用AutoLayout来完成这个不完整的事情。