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위한 애니메이션. 그러나 upperToolTipPathA는 ; 뷰의 기본 레이어가 아니므로 레이어 애니메이션으로 만 애니메이션 할 수 있습니다 . 즉, Core Animation, 즉 CABasicAnimation을 의미합니다.

따라서 만들고 싶은 애니메이션을 만들려면 Core Animation을 사용해야합니다.

또는 모양 레이어를 기본 레이어로 호스팅하는보기를 만들 수 있습니다. 그러면 뷰 애니메이션을 사용할 수 있습니다.

하지만이 경우에는 Core Animation을 사용하는 것이 더 낫다고 생각합니다. 다음 당신이하려는 일의 예입니다 .

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)