使用NSLayoutConstraints

时间:2016-12-17 13:29:44

标签: ios swift animation core-animation uiviewanimation

我正在尝试实现手势驱动程序交互式动画,其中使用NSLayoutConstraints执行布局更改。使用UIView.animate(withDuration:)时动画效果很好,但它不是百分比驱动的。

private func configureRight() {
    UIView.animate(withDuration: 1.0) {
        NSLayoutConstraint.activate(self.constraints2)
        NSLayoutConstraint.deactivate(self.constraints1)
        self.layoutIfNeeded()
    }
} 

当您只是更改已安装的约束时,它很简单。如果起始值为50,结束值为100,并且您希望将动画设置为50%,则在动画块中将值更改为75非常简单。但enableddisabled之间没有中间位置。

我尝试使用CABasicAnimation,但似乎无法使用CABasicAnimation激活/停用布局约束。有没有办法访问UIView.animate(withDuration:)创建的动画,以手动修改动画进度?

1 个答案:

答案 0 :(得分:3)

是的,您可以深入了解UIView动画创建和操作它们的基础动画,但它非常痛苦。

我在Github上有一个名为KeyframeViewAnimations的项目(在Objective-C中),它创建了一个基于UIView和基于CAAnimation的关键帧动画版本,并展示了如何暂停,恢复和擦洗它来回走动。该存储库中还有一个自述文件 " Sleuthing UIView Animations"这解释了如何找出系统响应UIView动画生成的CAAnimations。

我花了很长时间才把这些东西拿出来,而且我有一段时间没看过它,所以我不记得那些血腥的细节。就像我说的那样,它变得复杂了。

您可能希望改为使用iOS 10中添加的新UIViewPropertyAnimator类。

我在github上有一个名为UIViewPropertyAnimator-test的项目,演示了如何使用这个新类。尽管擦洗动画不能保留自定义时序曲线,但它使来回擦洗动画变得更加容易。

编辑:

顺便说一句,你有两组不同的约束?如果要在动画的不同部分之间进行插值,可能需要找到一种方法来修改一个或多个约束上的常量值,而不是关闭一个约束并启用另一个约束。 (例如,您对视图有约束,该视图指定相对于其顶部超级视图的Y位置为50。您可以设置动画将约束的常量从50更改为300以将视图向下移动