CABasicAnimation持续时间&保持层位置

时间:2015-08-17 14:43:48

标签: ios objective-c swift animation

我正在尝试为UIButton制作非常基本的动画。目标是将层旋转180度。这是我的动画代码,它是从beginTrackingWithTouch

调用的
private func rotateButton() {
    let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
    rotationAnimation.timingFunction = CAMediaTimingFunction(name: "easeIn")
    rotationAnimation.toValue = M_PI
    rotationAnimation.duration = CollapseButton.kCollapseButtonAnimationDuration
    rotationAnimation.repeatCount = 1
    rotationAnimation.cumulative = true
    layer.addAnimation(rotationAnimation, forKey: "rotationAnimation")
}

现在,我想在点击此按钮时添加折叠视图动画。在我的VC中:

__weak __typeof(self) weakSelf = self;
[UIView animateWithDuration:CollapseButton.kCollapseButtonAnimationDuration animations:^{

    CGRect currentFrame = weakSelf.frame;
    currentFrame.size.height = 20;
    weakSelf.frame = currentFrame;

}];

我有两个问题:

  1. 按钮完成动画后,它会重置图层位置。因此,如果箭头显示顶部,它会动画显示向下并最终重置为顶部。如何保留图层方向?

  2. 正如您所见,动画持续时间和计时功能是相同的。因为我无法理解UIView动画的速度要慢得多。有任何想法吗?

1 个答案:

答案 0 :(得分:3)

核心动画很奇怪。动画会创建一个“表示层”,用于生成您正在制作动画的更改的外观,但实际上并未更改相关属性。

为了让动画在最终状态下完成对象,你应该设置fromValue(在起始设置)和toValue,然后在提交动画后将属性设置为它的结束值: / p>

private func rotateButton() {
    let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
    rotationAnimation.timingFunction = CAMediaTimingFunction(name: "easeIn")
    rotationAnimation.fromValue = 0.0 //<<--- NEW CODE
    rotationAnimation.toValue = M_PI
    rotationAnimation.duration = CollapseButton.kCollapseButtonAnimationDuration
    rotationAnimation.repeatCount = 1
    rotationAnimation.cumulative = true
    layer.addAnimation(rotationAnimation, forKey: "rotationAnimation")
    layer.transform = CATransformMakeRotation(M_PI) //<<--- NEW CODE
}

您还可以将动画的removeWhenFinished属性设置为true,但这有其他复杂情况。

顺便说一句,你不应该试图操纵具有非身份变换的视图的帧。而是在视图的变换上设置比例。

我不确定为什么2个动画花费不同的时间。我注意到你正在将CAAnimation的计时功能设置为easeIn,但是将UIView的计时功能保留为默认值(缓入,缓出)。这将创建看起来不一样的动画。您应该将视图动画设置为使用easeIn时间。 (为此,您需要使用更长的格式animateWithDuration:delay:options:animations:completion: