CAShapeLayerのスケーリングアニメーションの問題[重複]

Nov 23 2020

スライダーのツールチップの簡単なパスを作成しました。表示されたとおりにアニメーション化して、ユーザーがドラッグできることを認識できるようにしたかったのです。

しかし、それはアニメートしません:

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

アニメーションを手伝ってくれませんか。

回答

3 matt Nov 23 2020 at 22:39

UIView.animate用でビューのアニメーション。しかしupperToolTipPathレイヤーです; ビューのプライマリレイヤーではないため、レイヤーアニメーションでのみアニメーション化できます。つまり、Core Animation、つまりCABasicAnimationを意味します。

したがって、作成したいアニメーションを作成するには、CoreAnimationを使用する必要があります。

または、シェイプレイヤーをプライマリレイヤーとしてホストするビューを作成することもできます。そうすれば、ビューアニメーションを使用できるようになります。

しかし、この場合はCoreAnimationを使用する方が良いと思います。これがあなたがやろうとしていると思うようなことの例です:

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)