2016-12-07 2 views
1

질문 : CAShapeLayer()에 빠르게 색상을 통해CAShapeLayer에서 색상을 빠르게 순환시키는 방법은 무엇입니까?

아래 코드주기. 은 정상적으로 작동하지만 장치를 예열합니다. CAShapeLayer()에서 색상을 빠르게 순환시키는 더 효율적인 방법이 더 많습니까? ?

1 부

아래의 코드는 예를 들어, 정방형 UIBezierPath()로서, 묘화되어 CAShapeLayer() 층을 채운다.

let path = UIBezierPath() 
path.moveToPoint(CGPoint(x: 0, y: 0)) 
path.addLineToPoint(CGPoint(x: 0, y: 100)) 
path.addLineToPoint(CGPoint(x: 100, y: 100)) 
path.addLineToPoint(CGPoint(x: 100, y: 0)) 
path.closePath() 

let shape = CAShapeLayer() 
shape.path = path.CGPath 
shape.fillColor = UIColor.yellowColor().CGColor 

2 부

다음으로, 나는 이미지 효과, 아래의 예제 이미지를 번쩍 여러 가지 빛깔을주고, 연속으로 빠르게 색상을 통해 CAShapeLayer() 효과적으로 사이클에 CAKeyframeAnimation 애니메이션을 추가 할 수 있습니다.

let colorsAnimation = CAKeyframeAnimation(keyPath: "fillColor") 

colorsAnimation.values = [UIColor.redColor().CGColor, UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor, UIColor.blueColor().CGColor] 

colorsAnimation.keyTimes = [0.25, 0.5, 0.75, 1.0] 
colorsAnimation.calculationMode = kCAAnimationLinear 
colorsAnimation.removedOnCompletion = false 
colorsAnimation.fillMode = kCAFillModeForwards 
colorsAnimation.duration = 0.5 
colorsAnimation.repeatCount = Float.infinity 

shape.addAnimation(colorsAnimation, forKey: nil) 

이미지 :

enter image description here

+0

계산 모드'kCAAnimationDiscrete'을 시도하십시오. 현재 선형이 색상을 보간하려고 시도하며, 이산은하지 않습니다. 네가 더 잘할 수 있는지 확실하지 않니? – Alistra

+0

고마워요, @Alistra. 나는'kCAAnimationDiscrete'을 시도했지만'kCAAnimationLinear'처럼 보이는 색상 사이의 부드러운 변화를 제공하지 않습니다. 내 이미지가 다소 오도 된 것 같습니다. 그러나 귀하의 제안은 내가 성취하려는 것을 정확하게 생각하게 만들었습니다. 감사합니다! – user4806509

+0

배열에 더 많은 색을 사용하고 보간하지 마십시오. – Alistra

답변

1

그것은 이것이 내가 내 응용 프로그램에서 그것을 할 방법입니다, 약간 긴입니다 만 (전화, 따뜻해 should't 적어도 광산하지 않습니다)

var colorArray = [UIColor.red, UIColor.blue, UIColor.yellow, UIColor.orange, UIColor.green, UIColor.cyan, UIColor.purple] 

var colorIndex = 0 
var shouldStop = false 

func sequenceA() { 

    UIView.animate(withDuration: 0, delay: 0.2, options: .allowUserInteraction, animations: { 

     shape.fillColor = colorArray[colorIndex].CGColor 

    }, completion: {finished in 

     print(colorArray[colorIndex]) 

     if colorIndex == colorArray.count - 1 { 
      colorIndex = 0 
     } 
     colorIndex+=1 
     sequenceB() 

    }) 
} 

func sequenceB() { 

    // When you want to stop 
    if shouldStop == true { 
     return 
    } 


    UIView.animate(withDuration: 0, delay: 0.2, options: .allowUserInteraction, animations: { 

     shape.fillColor = colorArray[colorIndex].color 


    }, completion: {finished in 

     print(colorArray[colorIndex]) 

     if colorIndex == colorArray.count - 1 { 
      colorIndex = 0 
     } 
     colorIndex+=1 
     sequenceA() 

    }) 
} 


sequenceA() 

initate는 단지 sequenceA 또는 B를 호출하고, 그 컬러를 변경하는 반복 프로세스 자체로 잠근다. 중지하려면 shouldStop을 true로 설정하면됩니다.

두 기능의 지연을 변경하고 색상 유형을 원하는대로 전환하여 색상 전환 속도를 원하는대로 변경할 수 있습니다. 희망이 도움이!

+0

감사합니다. @ Garret Kaye. 이것은 효과가있을 수 있지만 실제로는 내 이미지에 표시되지 않는 색상 사이의 부드러운 변화가있었습니다. 죄송합니다. 필자가 읽은 다른 글에서,'CAShapeLayer'의 매끄러운 채우기 변경을 달성하는 유일한 방법은'CAKeyframeAnimation'을 통해서라고 믿습니다. 그러나 당신의 제안은 너무 그러나 나에게 더 생각하게했고, 내가 그것을 이루려고 노력하고있는 것을 되 찾는다. 그래서 고마워한다! – user4806509

+0

문제 없습니다, 행운을 비네! –