gpt4 book ai didi

ios - 同时分别为图层变换的旋转和缩放比例设置不同的持续时间

转载 作者:行者123 更新时间:2023-12-01 19:51:06 25 4
gpt4 key购买 nike

下面的问题是赋予比例动画的持续时间会覆盖旋转动画。

还有其他方法可以同时对CALayer的比例和旋转进行不同时间的动画处理吗?

    // 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)
}

Rotate and scale layer transform simultaneously

关于ios - 同时分别为图层变换的旋转和缩放比例设置不同的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com