2017-05-15 3 views
2

J'ai réalisé une classe UIView personnalisée pour réaliser une sorte de trapèze; le code suivant, je l'avais utilisé pour réaliser la classe:Ajouter une couleur de dégradé à un UIView personnalisé

import UIKit 
import ChameleonFramework 

class PolygonalView: UIView 
{ 
    override init(frame: CGRect) 
    { 
     super.init(frame: frame) 
    } 

    required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 
    } 

    override func draw(_ rect: CGRect) { 

     guard let context = UIGraphicsGetCurrentContext() else { return } 

     context.beginPath() 
     context.move(to: CGPoint(x: rect.minX, y: rect.minY)) 
     context.addLine(to: CGPoint(x: rect.minX, y: rect.maxY)) 
     context.addLine(to: CGPoint(x: rect.maxX, y: 171)) 
     context.addLine(to: CGPoint(x: rect.maxX, y: rect.minY)) 
     context.closePath() 

     context.setFillColor(FlatSkyBlue().cgColor) 
     context.fillPath() 
    } 
} 

Puis dans mon UIViewController j'avais créer mon point de vue:

let pol = PolygonalView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 196)) 
     pol.backgroundColor = UIColor.clear 

     self.view.addSubview(pol) 

enter image description here

j'atteint mon objectif, eh oui! Mais un problème est survenu: si je règle un dégradé, ce dégradé recouvre tout le cadre rectangulaire de la vue. Les codes suivants et l'image ...

let gradientColor = CAGradientLayer() 
     gradientColor.frame = pol.bounds 
     gradientColor.colors = [FlatSkyBlue().cgColor, FlatSkyBlueDark().cgColor, FlatBlue().cgColor] 
     gradientColor.startPoint = CGPoint(x: 0, y: 0) 
     gradientColor.endPoint = CGPoint(x: 1, y: 1) 
     pol.layer.addSublayer(gradientColor) 

enter image description here

Toutes les solutions pour adapter le gradient à la forme réelle de mon point de vue?

+0

CALayers une propriété 'mask' que vous pouvez utiliser pour y parvenir. –

Répondre

2

Set mask propriété à CAShapeLayer() qui a la forme correcte de la couche gradientColor remplie de noir

let mask = CAShapeLayer() 
mask.frame = // to whatever size it should be 
mask.path = yourShapeBezierHERE.cgPath 
mask.fillColor = UIColor.black.cgColor 
gradientColor.mask = mask 
+0

Merci beaucoup mec! Je suis Noob à couche, bezier, que aussi masque. Je dois définir le masque de calque dans ma classe customView (PolygonalView)? Pourriez-vous également m'envoyer un lien pour en savoir plus sur les masques et les calques? Merci beaucoup. –

+0

Je n'ai pas de lien autre que l'Apple Docs officiel –

+0

Alors, vous pourriez m'aider à mettre cette ligne de codes? J'ai essayé de mettre le masque dans le UIViewController mais je ne suis pas capable de récupérer le chemin (j'ai essayé avec pol.accessibilityPath et pol.layer.accessibilityPath mais cela n'a pas fonctionné). –