使用 NSLayoutConstraints 的百分比驱动动画

Percentage driven animation with NSLayoutConstraints

我正在尝试实现手势驱动程序交互动画,其中使用 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 来 activate/deactivate 布局约束。是否有某种方法可以访问 UIView.animate(withDuration:) 创建的动画以使用手势识别器手动修改动画进度?

是的,您可以深入研究 UIView 动画创建的底层动画并对其进行操作,但这非常痛苦。

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

我花了很长时间才弄清楚这些东西,而且我已经有一段时间没有看过它了,所以我不太记得那些血淋淋的细节。就像我说的,它变得复杂了。

您可能想改用 iOS 10.

中添加的新 UIViewPropertyAnimator class

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

编辑:

顺便说一句,您的 2 组不同的约束是什么?如果您想在动画的不同部分之间进行插值,您可能希望找到一种方法来修改一个或多个约束的常量值,而不是关闭一个约束并打开另一个约束。 (例如,假设您对一个视图有一个约束,该视图指定相对于其父视图顶部的 Y 位置为 50。您可以通过动画将约束的常量从 50 更改为 300 以向下移动视图。