Redondea algunas esquinas de UIView y networkingondea el borde de la capa de la vista también

Estoy intentando networkingondear las dos esquinas inferiores de una UIView, y hacer que el borde de la capa se muestre networkingondeado también. Actualmente estoy haciendo:

UIRectCorners corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; CGSize radii = CGSizeMake(kThisViewCornerRadius, kThisViewCornerRadius); UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myView.bounds byRoundingCorners:corners cornerRadii:radii]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; [maskLayer setPath:path.CGPath]; myView.layer.mask = maskLayer; 

Esto funciona bien para las vistas normales. Sin embargo, la capa de borderColor tiene su set borderColor y borderWidth , y como puede ver en la captura de pantalla, el borde de la capa no se está networkingondeando:

Captura de pantalla del problema

También probé subclassando UIView y volviendo [CAShapeLayer layer] de +[Class layerClass] , y configurando la capa de la vista como una capa de forma, pero el borde terminó debajo de las subvistas de la vista.

¿Es posible networkingondear algunas de las esquinas de una vista, networkingondear el borde de la capa de la vista y recortar las subtestings debajo del borde de la capa?

Tenga en count que no se trata de cómo networkingondear algunas esquinas y no otras, sino cómo lograr que el trazo se comporte correctamente.

Me di count de una nueva forma de pensar al respecto, gracias al comentario de David Rönnqvist .

Estaba tratando de hacer el networkingondeo de esquina y el golpe en una sola capa. En cambio, lo dividí en dos capas: una para enmascarar la capa de la vista para networkingondear las esquinas, y la otra para agregar el trazo.

 UIView *containerView = [[UIView alloc] initWithFrame:someFrame]; UIRectCorners corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; CGSize radii = CGSizeMake(kThisViewCornerRadius, kThisViewCornerRadius); UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myView.bounds byRoundingCorners:corners cornerRadii:radii]; // Mask the container view's layer to round the corners. CAShapeLayer *cornerMaskLayer = [CAShapeLayer layer]; [cornerMaskLayer setPath:path.CGPath]; containerView.layer.mask = cornerMaskLayer; // Make a transparent, stroked layer which will dispay the stroke. CAShapeLayer *strokeLayer = [CAShapeLayer layer]; strokeLayer.path = path.CGPath; strokeLayer.fillColor = [UIColor clearColor].CGColor; strokeLayer.strokeColor = [UIColor networkingColor].CGColor; strokeLayer.lineWidth = 2; // the stroke splits the width evenly inside and outside, // but the outside part will be clipped by the containerView's mask. // Transparent view that will contain the stroke layer UIView *strokeView = [[UIView alloc] initWithFrame:containerView.bounds]; strokeView.userInteractionEnabled = NO; // in case your container view contains controls [strokeView.layer addSublayer:strokeLayer]; // configure and add any subviews to the container view // stroke view goes in last, above all the subviews [containerView addSubview:strokeView]; 

La respuesta de Zev Eisenberg es la correcta.

Aunque yo prefiero:

 [self.layer addSublayer:strokeLayer]; 

en lugar de crear y agregar una subvista:

 CGSize radii = CGSizeMake(radius, radius); UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:radii]; // Mask the container view's layer to round the corners. CAShapeLayer *cornerMaskLayer = [CAShapeLayer layer]; [cornerMaskLayer setPath:path.CGPath]; self.layer.mask = cornerMaskLayer; // Make a transparent, stroked layer which will dispay the stroke. CAShapeLayer *strokeLayer = [CAShapeLayer layer]; strokeLayer.path = path.CGPath; strokeLayer.fillColor = [UIColor clearColor].CGColor; strokeLayer.strokeColor = color.CGColor; strokeLayer.lineWidth = 2; // the stroke splits the width evenly inside and outside, // but the outside part will be clipped by the containerView's mask. [self.layer addSublayer:strokeLayer]; 

Aquí está el pequeño código. Alloc inicia una vista y envía a este método para que las esquinas se networkingondean. Puede, opcionalmente, networkingondear cualquiera de las esquinas que desee. También da color de trazo de sombra.

  -(void) setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners withColor: (UIColor*) color { UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(9.0, 9.0)]; CAShapeLayer* shape = [[[CAShapeLayer alloc] init] autorelease]; [shape setPath:rounded.CGPath]; shape.strokeColor = [[UIColor grayColor] CGColor]; view.backgroundColor=color; view.layer.mask = shape; } 

Llame al método de esta manera.

 [self setMaskTo:ABCView byRoundingCorners:UIRectCornerAllCorners withColor:[UIColor greenColor]];