2017-09-21 8 views
0

세 가지 색 그라디언트 을 천천히에 적용하고 싶습니다.CAGradientLayer 애니메이션 속도 느려짐

나는과 같이 정의 UIView 있습니다

class MyView: UIView, CAAnimationDelegate { 

    lazy var gradientLayer: CAGradientLayer = { 
     let l = CAGradientLayer() 
     l.frame = self.frame 
     l.colors = self.colors 
     l.startPoint = CGPoint(x: 0, y: 0) 
     l.endPoint = CGPoint(x: 1, y: 0) 
     l.mask = self.textLayer 
     return l 
    }() 

    lazy var textLayer: CATextLayer = { 
     let l = CATextLayer() 
     l.frame = self.frame 
     l.string = "test".uppercased() 
     l.fontSize = 23 
     return l 
    }() 

    var colors: [CGColor] = [ 
      UIColor.red.cgColor, 
      UIColor.purple.cgColor, 
      UIColor.blue.cgColor 
      ] 

    init() { 
    ... 
    self.layer.addSublayer(gradientLayer) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func animate() { 

     var newColors = colors 
     let lastColor: CGColor = newColors.last! 
     newColors.removeLast() 
     newColors.insert(lastColor, at: 0) 

     colors: newColors 
     gradientLayer.colors = newColors 

     let a = CABasicAnimation(keyPath:"colors") 
     a.toValue = newColors 
     a.duration = 0.1 
     a.isRemovedOnCompletion = true 
     a.fillMode = kCAFillModeForwards 
     a.delegate = self 

     gradientLayer.add(a, forKey:"animateGradient") 

    } 

    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 

      animate() 
    } 

} 

이 작동하지만, 매우 빠릅니다. 어떻게 막히지 않고 애니메이션을 느리게 할 수 있습니까? colors 배열에 몇 백 가지 색상을 추가해야 순환 할만큼 충분합니까?

감사

+0

그냥 a.duration = 0.1을 느리게 변경하려고하지 않습니까? – rambossa

+0

'duration'을 더 작게 설정하면 애니메이션이 더 빨리 진행됩니다. 더 커지고 유동적 인 애니메이션은 없습니다. 그것은 점프와 같고 애니메이션이 아닙니다. – Joseph

+0

'UIColor'''red'''''''''''''''''''blue'' 메소드를 사용하여 애니메이션 블록 내에서 값을 변경할 수 있습니다. 그러나 당신은 당신의 3 원색을 덮는 방식으로'RGB'의 조합을하는 알고리즘을 생각해 낼 필요가 있습니다. –

답변

0

난 당신이 애니메이션에서 fromValue을 설정하지 않은 코드에서 뭔가를 누락하지 않는 한.

func animate() { 
    let oldColors = colors 
    var newColors = colors 
    let lastColor: CGColor = newColors.last! 
    newColors.removeLast() 
    newColors.insert(lastColor, at: 0) 

    colors = newColors 
    gradientLayer.colors = newColors 

    let a = CABasicAnimation(keyPath:"colors") 
    // New line here -> 
    a.fromValue = oldColors 
    a.toValue = newColors 
    a.duration = 0.1 
    a.isRemovedOnCompletion = true 
    a.fillMode = kCAFillModeForwards 
    a.delegate = self 

    gradientLayer.add(a, forKey:"animateGradient") 

} 

이 당신이 정말로 지연 스냅을 생성하는 코드를 효과적으로 설정 된 animation-을받지 못하고있는 이유가 될 것입니다 : 당신이 newColors에 색상을 전환하기 전에 확실히 당신은 색상의 이전 값으로 설정해야합니다 전이.

+0

애니메이션이 너무 빨라서 ... 너무 빠르게 날아간다는 것을 알았습니다 ... 완료하는 데 1 분 정도 걸릴 수 있습니다. – Joseph

+0

내 코드를 사용하고 기간을 60으로 변경하면 속도가 느려 집니까 (책상에서 떨어져서 코드를 테스트 할 수 없다는 사과?) – Sparky

관련 문제