我正在尝试为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;
}];
我有两个问题:
按钮完成动画后,它会重置图层位置。因此,如果箭头显示顶部,它会动画显示向下并最终重置为顶部。如何保留图层方向?
正如您所见,动画持续时间和计时功能是相同的。因为我无法理解UIView动画的速度要慢得多。有任何想法吗?
答案 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:
)