cocoa-touch uiview

cocoa touch - Cómo dibujar una sola esquina redondeada de mi UIView.



swift frames (4)

¡Hola! Quiero dibujar una esquina redondeada de mi UIView . Solo uno , otros no pueden ser cambiados.


A partir de iOS 3.2, puede utilizar la funcionalidad de UIBezierPath s para crear un rectángulo redondeado ( UIBezierPath para usar) (donde solo las esquinas que especifique están redondeadas). Luego puedes usar esto como la ruta de acceso de un CAShapeLayer , y usarlo como una máscara para la capa de tu vista:

// Create the path (with only the top-left corner rounded) UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerTopLeft cornerRadii:CGSizeMake(10.0, 10.0)]; // Create the shape layer and set its path CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = imageView.bounds; maskLayer.path = maskPath.CGPath; // Set the newly created shape layer as the mask for the image view''s layer imageView.layer.mask = maskLayer;

Y eso es todo: no se pierda la definición manual de formas en Core Graphics, no cree imágenes de enmascaramiento en Photoshop. La capa ni siquiera necesita invalidarse. Aplicar la esquina redondeada o cambiar a una nueva esquina es tan simple como definir un nuevo UIBezierPath y usar su CGPath como CGPath la capa de máscara. El parámetro de corners del bezierPathWithRoundedRect:byRoundingCorners:cornerRadii: es una máscara de bits, por lo que se pueden redondear varias esquinas al ORARlas juntas.

NOTA : las máscaras de capa no se representarán cuando se utilicen en combinación con el método CALayer renderInContext. Si necesita usar esto, intente redondear las esquinas con lo siguiente: ¿ Sólo dos esquinas redondeadas? .


He realizado una función para hacer el radio de esquina personalizado después de realizar algunas actividades de I + D de la siguiente manera:

+(void)setConerRadiusForTopLeft:(BOOL)isForTopLeft ForTopRight:(BOOL)isForTopRight ForBottomLeft:(BOOL)isForBottomLeft ForBottomRight:(BOOL)isForBottomRight withCornerRadius:(float)cornerRadius forView:(UIView *)view { UIRectCorner corners = (isForTopLeft ? UIRectCornerTopLeft : 0) | (isForTopRight ? UIRectCornerTopRight : 0) | (isForBottomLeft ? UIRectCornerBottomLeft : 0) | (isForBottomRight ? UIRectCornerBottomRight : 0); UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(cornerRadius, cornerRadius)]; CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; maskLayer.frame = view.bounds; maskLayer.path = maskPath.CGPath; view.layer.mask = maskLayer; }


Hice un método de respuesta de StuDev:

+ (CAShapeLayer *) roundedCornerOnImage: (UIImageView *)imageView onCorner: (UIRectCorner)rectCorner { UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:rectCorner cornerRadii:CGSizeMake(10.0, 10.0)]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = imageView.bounds; maskLayer.path = maskPath.CGPath; return maskLayer; }

Ejemplo de uso en una vista de imagen en un UITableViewCell:

if (indexPath.row == 0) cell.imageView.layer.mask = [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerTopLeft]; else if (indexPath.row == self.arrayPeople.count - 1) cell.imageView.layer.mask = [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerBottomLeft];

Gracias a StuDev por una gran solución!


+ (CAShapeLayer *) roundedCornerOnImage: (UIImageView *)imageView onCorner: (UIRectCorner)rectCorner { UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:rectCorner cornerRadii:CGSizeMake(10.0, 10.0)]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = imageView.bounds; maskLayer.path = maskPath.CGPath; imageView.layer.mask=maskLayer return maskLayer; } if (indexPath.row == 0) [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerTopLeft]; else if (indexPath.row == self.arrayPeople.count - 1) [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerBottomLeft];

Una respuesta actualizada a la anterior, no necesita volver y administrar eso. Se puede hacer en esa función.