2017-05-12 6 views
1

touchesBegan 및 touchesMoved 지점에서 작성한 UIBezierPath 배열이 있습니다. 나는 그 (것)들의 끌기를 스크린에 살리고 싶다.UIBezierPath 배열의 애니메이션 그림

각 베 지어를 반복하지 않고 setNeedsDisplay()를 호출하지 않고 가장 좋은 방법은 무엇입니까? CAShapeLayer를 사용하는

override func draw(_ rect: CGRect) { 
     for bezier in beziers{ 
     bezier.stroke() 
     } 
    } 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesBegan(touches, with: event) 
     let cgPoint = touches.first!.location(in: self) 
     let bezierPath = ColorBezierPath() // subclass of UIBezierPath 
     bezierPath.lineWidth = lineWidth 
     bezierPath.color = color 
     bezierPath.move(to: cgPoint) 
     beziers.append(bezierPath) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesMoved(touches, with: event) 
     let cgPoint = touches.first!.location(in: self) 
     let bezierPath = beziers.last 
     bezierPath?.addLine(to: cgPoint) 
     setNeedsDisplay() 
    } 
+0

요구 사항이 드로잉 앱과 관련이 있습니까? –

+0

@PraveenKumar 네, "Draw Something"과 비슷합니다. UIBezierPath 배열을 저장하고 나중에 애니메이션에서 쇼 그리기를합니다. – Maor

+0

나중에 무엇을 의미합니까? 무언가를 그릴 때마다 사용자를 표시하고 싶지 않습니까? ! –

답변

2

가장 좋은

덕분 일 것이다. 그것은 경로와 다양한 다른 설정을 필요로합니다. 애니메이션을 적용하려면 strokeEnd 속성을 0.0에서 1.0으로 움직이면됩니다. 그러면 원하는 애니메이션 타이밍 매개 변수에 상관없이 처음부터 끝까지 경로를 그리는 효과를 얻을 수 있습니다.

let shapeLayer = CAShapeLayer()    // strokeEnd's model value is 1.0 by default 
shapeLayer.frame = containerLayer.bounds 
shapeLayer.path = bezierPath.cgPath 
containerLayer.addSublayer(shapeLayer) 

let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd") 
strokeEndAnimation.duration = 2.0 
strokeEndAnimation.fromValue = 0.0 

shapeLayer.add(strokeEndAnimation, forKey: "strokeEndAnimation") 
+0

감사합니다! 어떤 이유로'shapeLayer.fillColor'는 기본적으로'.black'으로 설정됩니다. 이상한 효과를 냈습니다. 알아내는 데 시간이 좀 걸렸어. – Maor