¿Cómo puedo hacer esquinas en ángulo en una UIView?

Hay MUCHAS preguntas aquí sobre hacer que las esquinas de UIView networkingondean. Lamentablemente, no puedo encontrar nada sobre cómo hacer esquinas en ángulo . ¿Cómo puedo hacer una UIView con esquinas cortadas en un ángulo de 45 grados?

Incluso puedes tener una estrella de oro de bonificación (figurativa) si puedes mostrarme cómo hacer que cualquier esquina individual se corte en un ángulo.

Editar: como reference, aquí hay un enlace a una pregunta que sospecho tiene una implementación similar a esta solución. Simplemente no sé qué tendría que cambiar.

Primero necesitas una ruta con las esquinas en ángulo:

 - (CGPathRef) makeAnglePathWithRect: (CGRect)rect withSize:(float) s { CGPoint one = CGPointMake( rect.origin.x +s, rect.origin.y); CGPoint two = CGPointMake( rect.origin.x + rect.size.width - s, rect.origin.y); CGPoint three = CGPointMake( rect.origin.x + rect.size.width, rect.origin.y +s); CGPoint four = CGPointMake( rect.origin.x + rect.size.width, rect.origin.y + rect.size.height -s); CGPoint five = CGPointMake( rect.origin.x + rect.size.width-s, rect.origin.y + rect.size.height); CGPoint six = CGPointMake(rect.origin.x+s, rect.origin.y + rect.size.height); CGPoint seven = CGPointMake(rect.origin.x, rect.origin.y + rect.size.height-s); CGPoint eight = CGPointMake(rect.origin.x, rect.origin.y + s); CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path,NULL,one.x, one.y); CGPathAddLineToPoint(path,NULL,two.x, two.y); CGPathAddLineToPoint(path,NULL,three.x, three.y); CGPathAddLineToPoint(path,NULL,four.x, four.y); CGPathAddLineToPoint(path,NULL,five.x, five.y); CGPathAddLineToPoint(path,NULL,six.x, six.y); CGPathAddLineToPoint(path,NULL,seven.x, seven.y); CGPathAddLineToPoint(path,NULL,eight.x, eight.y); CGPathAddLineToPoint(path,NULL,one.x, one.y); return path; } 

Luego debes usar la ruta para especificar una máscara:

 CAShapeLayer *maskLayer = [CAShapeLayer layer]; CGRect bounds = CGRectMake(0.0f, 0.0f, 100, 100); //figure out your bounds [maskLayer setFrame:bounds]; CGPathRef p = [self makeAnglePathWithRect:bounds withSize:20.0]; maskLayer.path = p; _myview.layer.mask = maskLayer; 

Si quieres eliminar los angularjs de cualquier esquina, juega con los puntos uno y ocho, eliminando el valor "s". Puede cambiar el tamaño de los triangularjs cortados de las esquinas con el parámetro de tamaño.

Aquí hay una forma de hacerlo. Dado:

const CGFloat kRadius = 20.0; //'radius' of the corner clip

y dada esta propiedad en su opinión:

@property (nonatomic,strong) CAShapeLayer *maskLayer;

puede configurar una capa de máscara simple con una unión de línea biselada (que le ofrece el ángulo de 45 grados que desea con mucha facilidad):

 CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.lineWidth = kRadius * 2.0; maskLayer.lineJoin = kCALineJoinBevel; maskLayer.strokeColor = [[UIColor blackColor] CGColor]; self.layer.mask = self.maskLayer = maskLayer; 

Luego, en el momento apropiado (diga en su -[ViewClass layoutSublayersOfLayer:] ) simplemente establezca la ruta de su capa de máscara en una ruta rectangular insertada por el radio:

self.maskLayer.path = CGPathCreateWithRect(CGRectInset(self.bounds,kRadius,kRadius), NULL);

Esa es una forma de hacerlo sin tener que recurrir a dibujar cada sección del path a mano. Básicamente, estás usando la línea bisel unirte para hacer ese poco de trabajo por ti. Espero que ayude.

Tomando inspiración de @nont y usando la extensión, escribo este fragment:

 extension UIView { public enum Corner: Int { case TopRight case TopLeft case BottomRight case BottomLeft case All } public func blendCorner(corner corner: Corner, length: CGFloat = 20.0) { let maskLayer = CAShapeLayer() var path: CGPathRef? switch corner { case .All: path = self.makeAnglePathWithRect(self.bounds, topLeftSize: length, topRightSize: length, bottomLeftSize: length, bottomRightSize: length) case .TopRight: path = self.makeAnglePathWithRect(self.bounds, topLeftSize: 0.0, topRightSize: length, bottomLeftSize: 0.0, bottomRightSize: 0.0) case .TopLeft: path = self.makeAnglePathWithRect(self.bounds, topLeftSize: length, topRightSize: 0.0, bottomLeftSize: 0.0, bottomRightSize: 0.0) case .BottomRight: path = self.makeAnglePathWithRect(self.bounds, topLeftSize: 0.0, topRightSize: 0.0, bottomLeftSize: 0.0, bottomRightSize: length) case .BottomLeft: path = self.makeAnglePathWithRect(self.bounds, topLeftSize: 0.0, topRightSize: 0.0, bottomLeftSize: length, bottomRightSize: 0.0) } maskLayer.path = path self.layer.mask = maskLayer } private func makeAnglePathWithRect(rect: CGRect, topLeftSize tl: CGFloat, topRightSize tr: CGFloat, bottomLeftSize bl: CGFloat, bottomRightSize br: CGFloat) -> CGPathRef { var points = [CGPoint]() points.append(CGPointMake(rect.origin.x + tl, rect.origin.y)) points.append(CGPointMake(rect.origin.x + rect.size.width - tr, rect.origin.y)) points.append(CGPointMake(rect.origin.x + rect.size.width, rect.origin.y + tr)) points.append(CGPointMake(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height - br)) points.append(CGPointMake(rect.origin.x + rect.size.width - br, rect.origin.y + rect.size.height)) points.append(CGPointMake(rect.origin.x + bl, rect.origin.y + rect.size.height)) points.append(CGPointMake(rect.origin.x, rect.origin.y + rect.size.height - bl)) points.append(CGPointMake(rect.origin.x, rect.origin.y + tl)) let path = CGPathCreateMutable() CGPathMoveToPoint(path, nil, points.first!.x, points.first!.y) for point in points { if point != points.first { CGPathAddLineToPoint(path, nil, point.x, point.y) } } CGPathAddLineToPoint(path, nil, points.first!.x, points.first!.y) return path } } 

De esta forma, puedes mezclar fácilmente tu rincón:

 let view = UIView() view.blendCorner(corner: .TopRight) // or view.blendCorner(corner: .All)