2017-09-22 7 views
0

J'ai eu ce CAShapeLayer tracer une ligne dans un tableau pour moi:gradient Ajouter à CAShapeLayer

open func generateLayer(path: UIBezierPath) -> CAShapeLayer { 
    let lineLayer = CAShapeLayer() 
    lineLayer.lineJoin = lineJoin.CALayerString 
    lineLayer.lineCap = lineCap.CALayerString 
    lineLayer.fillColor = UIColor.clear.cgColor 
    lineLayer.lineWidth = lineWidth 
    lineLayer.strokeColor = lineColors.first?.cgColor ?? UIColor.white.cgColor 

    lineLayer.path = path.cgPath 

    if dashPattern != nil { 
     lineLayer.lineDashPattern = dashPattern as [NSNumber]? 
    } 

    if animDuration > 0 { 
     lineLayer.strokeEnd = 0.0 
     let pathAnimation = CABasicAnimation(keyPath: "strokeEnd") 
     pathAnimation.duration = CFTimeInterval(animDuration) 
     pathAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
     pathAnimation.fromValue = NSNumber(value: 0 as Float) 
     pathAnimation.toValue = NSNumber(value: 1 as Float) 
     pathAnimation.autoreverses = false 
     pathAnimation.isRemovedOnCompletion = false 
     pathAnimation.fillMode = kCAFillModeForwards 

     pathAnimation.beginTime = CACurrentMediaTime() + CFTimeInterval(animDelay) 
     lineLayer.add(pathAnimation, forKey: "strokeEndAnimation") 

    } else { 
     lineLayer.strokeEnd = 1 
    } 

    return lineLayer 
} 

Maintenant, je voudrais attirer cette ligne avec un gradient au lieu d'une seule couleur. C'est ce que j'ai trouvé, mais malheureusement, ça ne me trompe pas. Sans ce code ajouté (lineColors.count == 1), la ligne est dessinée correctement avec une seule couleur.

fileprivate func show(path: UIBezierPath) { 
    let lineLayer = generateLayer(path: path) 
    layer.addSublayer(lineLayer) 

    if lineColors.count > 1 { 
     let gradientLayer = CAGradientLayer() 
     gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
     gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 
     gradientLayer.frame = self.bounds 
     gradientLayer.colors = lineColors 
     gradientLayer.mask = lineLayer 
     layer.addSublayer(gradientLayer) 
    } 
} 

Répondre

0

bien se avère que je recherchais plus d'une heure pour cette ligne:

gradientLayer.colors = lineColors 

J'ai oublié de cartographier les objets UIColors dans ce tableau aux objets CGColorRef ... Cette ligne fixe pour moi:

gradientLayer.colors = lineColors.map({$0.cgColor})