CAShapeLayer con UIBezierPath

Quería mostrar una vista en forma de triángulo en una celda UITableView como esta.

introduzca la descripción de la imagen aquí

Logré lograr esto usando el código de golpe.

import UIKit class TriangleView: UIView { override func drawRect(rect: CGRect) { let width = self.layer.frame.width let height = self.layer.frame.height let path = CGPathCreateMutable() CGPathMoveToPoint(path, nil, 0, 0) CGPathAddLineToPoint(path, nil, width, 0) CGPathAddLineToPoint(path, nil, 0, height) CGPathAddLineToPoint(path, nil, 0, 0) CGPathCloseSubpath(path) let mask = CAShapeLayer() mask.frame = self.layer.bounds mask.path = path self.layer.mask = mask let shape = CAShapeLayer() shape.frame = self.bounds shape.path = path shape.fillColor = UIColor.clearColor().CGColor self.layer.insertSublayer(shape, atIndex: 0) } } 

Mientras buscaba cómo crear forms en UIViews, descubrí que puedes usar UIBezierPath para hacer lo mismo. Así que intenté replicar lo mismo usando UIBezierPath .

 let path = UIBezierPath() path.moveToPoint(CGPoint(x: 0, y: 0)) path.moveToPoint(CGPoint(x: width, y: 0)) path.moveToPoint(CGPoint(x: 0, y: height)) path.moveToPoint(CGPoint(x: 0, y: 0)) path.closePath() let mask = CAShapeLayer() mask.frame = self.bounds mask.path = path.CGPath self.layer.mask = mask let shape = CAShapeLayer() shape.frame = self.bounds shape.path = path.CGPath shape.fillColor = UIColor.clearColor().CGColor self.layer.insertSublayer(shape, atIndex: 0) 

Pero esto simplemente no funciona. No se muestra ninguna forma.

¿Debo hacer algo adicional para que esto funcione?

Estás haciendo esto más difícil de lo que debe ser. Solo necesita agregar una capa de forma con una ruta y establecer el fillColor de fillColor de esa capa. Sin embargo, la razón principal por la que su código no funciona es porque está utilizando moveToPoint para todas sus líneas en lugar de addLineToPoint para todas, less la primera.

 class TriangleView: UIView { requinetworking init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init(frame: CGRect) { super.init(frame: frame) let path = UIBezierPath() path.moveToPoint(CGPoint(x: 0, y: 0)) path.addLineToPoint(CGPoint(x: frame.size.width, y: 0)) path.addLineToPoint(CGPoint(x: 0, y: frame.size.height)) path.closePath() let shape = CAShapeLayer() shape.frame = self.bounds shape.path = path.CGPath shape.fillColor = UIColor.blueColor().CGColor self.layer.addSublayer(shape) } } 

El problema debería ser la máscara en la capa y el color de la forma.
El siguiente código funciona para mí.

 class TriangleView: UIView { override func drawRect(rect: CGRect) { let width:CGFloat = bounds.width/9 let height:CGFloat = bounds.width/9 let path = UIBezierPath() path.moveToPoint(bounds.origin) path.addLineToPoint(CGPoint(x: width, y: bounds.origin.y)) path.addLineToPoint(CGPoint(x: bounds.origin.x, y: height)) // closePath will connect back to start point path.closePath() let shape = CAShapeLayer() shape.path = path.CGPath shape.fillColor = UIColor.blueColor().CGColor self.layer.insertSublayer(shape, atIndex: 0) // Setting text margin textContainerInset = UIEdgeInsetsMake(8, width, 8, 0) } } 
    Intereting Posts