Problem mit der Skalierung der Animation von CAShapeLayer [Duplikat]
Ich habe einen einfachen Pfad für den Tooltip eines Schiebereglers erstellt. Ich wollte, dass es so animiert wird, wie es erscheint, damit ein Benutzer weiß, dass er es ziehen kann.
Aber es animiert nicht:
let upperToolTipPath: CAShapeLayer = CAShapeLayer()
var path = UIBezierPath(roundedRect: CGRect(x: 0,y: 0, width: 65, height: 30), cornerRadius: 3)
path.stroke()
path.move(to: CGPoint(x: 50, y: 10))
path.addLine(to: CGPoint(x: 40, y: 30))
path.addLine(to: CGPoint(x: 15, y: 10))
upperToolTipPath.path = path.cgPath
self.layer.insertSublayer(upperToolTipPath, at: 0)
UIView.animate(
withDuration: 5,
delay: 3,
options: [.repeat, .autoreverse, .curveEaseIn],
animations: {
self.upperToolTipPath.transform = CATransform3DMakeScale(2, 2, 1)
})
Könnten Sie mir bei der Animation helfen?
Antworten
UIView.animate
dient zur Ansichtsanimation . Ist upperToolTipPath
aber eine Schicht ; Es ist nicht die primäre Ebene einer Ansicht, daher kann sie nur mit Ebenenanimation animiert werden. Das bedeutet Core Animation, dh CABasicAnimation.
Um die Animation zu erstellen, die Sie erstellen möchten, müssen Sie die Kernanimation verwenden.
Alternativ können Sie eine Ansicht erstellen, in der die Formebene als primäre Ebene gehostet wird. Dann könnten Sie die Ansichtsanimation verwenden.
Aber ich denke, in diesem Fall ist es besser, Core Animation zu verwenden. Hier ist ein Beispiel für die Art von Dingen, von denen ich denke, dass Sie sie versuchen:
let upperToolTipPath = CAShapeLayer()
upperToolTipPath.frame = CGRect(x: 0,y: 0, width: 65, height: 30)
let path = UIBezierPath(roundedRect: CGRect(x: 0,y: 0, width: 65, height: 30),
cornerRadius: 3)
upperToolTipPath.fillColor = UIColor.clear.cgColor
upperToolTipPath.strokeColor = UIColor.black.cgColor
upperToolTipPath.path = path.cgPath
self.layer.insertSublayer(upperToolTipPath, at: 0)
let b = CABasicAnimation(keyPath: #keyPath(CALayer.transform))
b.duration = 5
b.beginTime = CACurrentMediaTime() + 3
b.toValue = CATransform3DMakeScale(2, 2, 1)
b.repeatCount = .greatestFiniteMagnitude
b.autoreverses = true
upperToolTipPath.add(b, forKey:nil)