Ios 同时为层的旋转和缩放设置动画’;不同持续时间的s变换
下面的问题是,指定给缩放动画的持续时间会覆盖旋转动画 有没有其他方法可以同时为不同持续时间的CALayer缩放和旋转设置动画Ios 同时为层的旋转和缩放设置动画’;不同持续时间的s变换,ios,core-animation,Ios,Core Animation,下面的问题是,指定给缩放动画的持续时间会覆盖旋转动画 有没有其他方法可以同时为不同持续时间的CALayer缩放和旋转设置动画 // Animate arrowhead rotation CATransaction.begin() CATransaction.setAnimationDuration(0.2) CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: kCAMediaTi
// Animate arrowhead rotation
CATransaction.begin()
CATransaction.setAnimationDuration(0.2)
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut))
let arrowAngle = atan2(path.currentPoint.y - previousPoint.y,
path.currentPoint.x - previousPoint.x) + (.pi * 0.5)
let rotationZ = CATransform3DRotate(CATransform3DIdentity, arrowAngle, 0, 0, 1)
arrowhead.transform = rotationZ
CATransaction.commit()
// Animate arrowhead scale
CATransaction.begin()
CATransaction.setAnimationDuration(1.5)
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut))
arrowhead.transform = CATransform3DConcat(rotationZ, arrowheadTransformScale)
CATransaction.commit()
这就是它的工作原理:
override func viewDidLoad() {
let box = CALayer()
box.frame = CGRect(x: 150, y: 300, width: 100, height: 100)
box.backgroundColor = UIColor.white.cgColor
view.layer.addSublayer(box)
let boxTransform = box.transform
let currentAngle = atan2(boxTransform.m12, boxTransform.m11)
let currentScale = getScale(for: box.affineTransform())
let targetAngle: CGFloat = .pi / 3
let targetScale: CGFloat = 2
// Set layer properties to their target values before animating them.
var affineTransform = CGAffineTransform(rotationAngle: targetAngle)
affineTransform = affineTransform.scaledBy(x: targetScale, y: targetScale)
box.setAffineTransform(affineTransform)
let rotate = CABasicAnimation(keyPath: "transform.rotation.z")
rotate.fromValue = currentAngle
rotate.toValue = targetAngle
rotate.duration = 2
rotate.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
let scaleUp = CABasicAnimation(keyPath: "transform.scale")
scaleUp.fromValue = currentScale
scaleUp.toValue = targetScale
scaleUp.duration = 4
scaleUp.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
let rotateAndScale = CAAnimationGroup()
rotateAndScale.animations = [rotate, scaleUp]
rotateAndScale.duration = 4
// Setting key to "transform" overwrites the implicit animation created when setting the target values before the animation.
box.add(rotateAndScale, forKey: "transform")
}
func getScale(for t: CGAffineTransform) -> CGFloat {
return sqrt(t.a * t.a + t.c * t.c)
}
@matt有没有办法以不同的持续时间为层的缩放和旋转设置动画?@matt我还尝试使用此技术
arrowhead.setValue(arrowAngle,forKeyPath:“transform.rotation.z”)针对变换的特定方面
@matt这难道不需要整个动画使用kCAMediaTimingFunctionLinear
?