2012-10-08 47 views
11

Tengo un botón personalizado que quiero que el borde superior izquierdo se vea como un rectángulo redondo normal.¿Cree una esquina de botón de rectángulo redondeada personalizada en la esquina superior izquierda?

He encontrado el código que hace que todas las esquinas redondeadas:

_myButton.layer.cornerRadius = 8; 
_myButton.layer.borderWidth = 0.5; 
_myButton.layer.borderColor = [UIColor grayColor].CGColor; 
_myButton.clipsToBounds = YES; 

enter image description here

¿Cómo puedo solucionar el código para que sea redonda sólo en el lado superior izquierdo?


Editar:

_myButton.layer.borderWidth = 2; 
_myButton.layer.borderColor = [UIColor blackColor].CGColor; 

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_myButton.bounds 
                byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight 
                 cornerRadii:CGSizeMake(7.0, 7.0)]; 

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 

maskLayer.frame = _myButton.bounds; 
maskLayer.path = maskPath.CGPath; 
_myButton.layer.mask = maskLayer; 
[maskLayer release]; 

Este código no funciona. El botón completo desaparece.

+0

Aquí es una pregunta similar/respuesta sobre cómo se puede utilizar un UIBezierPath decir qué esquinas para mantener/máscara en una UIView: http://stackoverflow.com/questions/10995226/how-to -make-a-half-rounded-top-corner-rounded-texview-with-border – Brayden

+0

Utilicé el código provisto allí. Pero no funciona. Agregué el código al final de la pregunta. puedes ayudarme @Brayden? – Ali

Respuesta

23

Casi lo tienes, pero después de construir tu CAShapeLayer, úsala para agregarse como una subcapa de la capa de tu botón, no como una máscara alfa para ocultar algunas partes de tu botón (en ese caso las esquinas).

UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.frame = CGRectMake(10,300,300,40); 
[button setTitle:@"Hey" forState:(UIControlStateNormal)]; 
[button setTitleColor:[UIColor blueColor] forState:(UIControlStateNormal)]; 

UIBezierPath *shapePath = [UIBezierPath bezierPathWithRoundedRect:button.bounds 
               byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight 
                 cornerRadii:CGSizeMake(7.0, 7.0)]; 

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.frame = button.bounds; 
shapeLayer.path = shapePath.CGPath; 
shapeLayer.fillColor = [UIColor clearColor].CGColor; 
shapeLayer.strokeColor = [UIColor blackColor].CGColor; 
shapeLayer.lineWidth = 2; 
[button.layer addSublayer:shapeLayer]; 

[self.view addSubview:button]; 
+0

gracias, mira esta línea: '[_myButton.layer addSublayer: shapePath];' ¿Quieres decir 'shapeLayer' en lugar de shapePath? – Ali

+0

En realidad lo probé con shapeLayer pero no funcionó. – Ali

+1

eso es lo que quise decir con sry. ¿Qué quiere decir con "no funcionó" cómo se veía? – AliSoftware

1
CAShapeLayer * positiveCorner = [CAShapeLayer layer]; 
positiveCorner.path = [UIBezierPath bezierPathWithRoundedRect: self.button.bounds 
              byRoundingCorners: UIRectCornerTopRight | UIRectCornerBottomRight 
                cornerRadii: (CGSize){5, 5}].CGPath; 

self.button.layer.mask = positiveCorner; 
Cuestiones relacionadas