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.