使用缓动曲线设置高度约束的动画

时间:2017-07-12 17:18:30

标签: ios swift

有没有办法使用缓动曲线为高度约束设置动画?我想的可能是某种方式来设置CAKeyFrameAnimation我想要的值和时间,并以某种方式影响高度约束。

我不确定是否存在可用于约束键帧的约束的单独动画calss,或者如果CAKeyFrameAnimation允许我使用该类,或者如果它是{不可能。

编辑:以下是我正在尝试为我工作的内容,如果有人知道我是否走在正确的道路上,我会感谢一些指导:

self.heightConstraint.constant = newHeight

let animation = CAKeyframeAnimation(keyPath: "frame.size.height")
animation.values = [self.frame.size.height, newHeight]
animation.keyTimes = [0, 1]
animation.duration = self.animationDuration
animation.delegate = self

self.layer.add(animation, forKey: "heightChange")

newHeight将是我想要的高度。但这只会让视图更高,没有任何动画。我正确使用这个吗?这可能与约束有关吗?

编辑2:我应该添加,我想使用比Apple提供的默认值更复杂的缓动函数UIView.animate(withDuraiton:...

1 个答案:

答案 0 :(得分:2)

无需使用CAKeyframeAnimation。与任何其他动画一样,UIView动画会将动画放宽到约束条件:

myConstraintOutlet.constant = someNewValue
UIView.animate(
  duration: 0.5,
  delay: 0.0,
  options: .curveEaseInOut, //Use ease-in, ease-out timing.
  animations:  {

    self.view.layoutIfNeeded()
  },
  completion: nil)

编辑:

如果你想要自定义计时,你也可以使用基于UIView的关键帧动画和方法animateKeyframes(withDuration:delay:options:animations:completion:)(UIView动画比CAAnimations更容易使用。)

编辑#2:

或者,如果您需要的是不同的立方缓和曲线,您也可以这样做。请参阅此链接的最后一位:https://medium.com/@RobertGummesson/a-look-at-uiview-animation-curves-part-3-edde651b6a7a

关键位是该链接的代码段:

circleView.transform = CGAffineTransformMakeScale(0, 0)

let timingFunction = CAMediaTimingFunction(controlPoints: 5/6, 0.2, 2/6, 0.9)

CATransaction.begin()
CATransaction.setAnimationTimingFunction(timingFunction)

UIView.animateWithDuration(1) {
    self.circleView.transform = CGAffineTransformIdentity
}

CATransaction.commit()

(那不是我的代码,它是Robert Gummesson的,来自上面的链接。所有写作的信用都归他所有。)