¿Cómo hacer el enmascaramiento de image de tipo hexágono en imageview en ios?

Quiero implementar el enmascaramiento de imágenes en la vista de imágenes en iOS. El enmascaramiento de la image debe ser hexágono con esquinas networkingondeadas. algunos de los códigos de terceros están disponibles pero no tienen esquinas networkingondeadas.

por favor, ayúdame. ya que soy nuevo en iOS.

Dependiendo de cómo muestres la image, puedes enmascararla de diferentes maneras.

Caso 1: CALayer

Puede usar la propiedad de la mask en CALayer. Esta propiedad es de tipo CALayer* y enmascarará la capa de destino de manera adecuada al canal alfa de la capa dada. Tenga en count que esta propiedad puede ser una subclass de CALayer , en particular CAShapeLayer que le permite especificar una ruta directa para la máscara (aquí puede especificar el hexágono). También tenga en count para asegurarse de establecer un color opaco en la capa enmascarada para que la capa enmascarada se enmascara realmente.

Nota: Si necesita ayuda para dibujar el path del hexágono, hágamelo saber, hace poco hice la geometry para eso el día de hoy: D

Caso 2: CoreGraphics

Puede usar CGImageMaskCreate y CGImageCreateWithMask así:

 - (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)mask { CGImageRef cgmask = CGImageMaskCreate(CGImageGetWidth(mask.CGImage), CGImageGetHeight(mask.CGImage), CGImageGetBitsPerComponent(mask.CGImage), CGImageGetBitsPerPixel(mask.CGImage), CGImageGetBytesPerRow(mask.CGImage), CGImageGetDataProvider(mask.CGImage), NULL, false); CGImageRef cgmaskedImage = CGImageCreateWithMask(image.CGImage, cgmask); UIImage *retval = [UIImage imageWithCGImage:maskedImageRef]; CGImageRelease(cgmask); CGImageRelease(cgmaskedImage); return retval; } 

Se supone que la image de la máscara es negra donde quieres que esté la máscara. De esta forma, puedes crear un hexágono en Photoshop y luego usar este método para crear una image enmascarada. Lo bueno es que esto escalará automáticamente la image de la máscara si es necesario también.

Personalmente, prefiero usar CALayer s, ya que incluso un UIImageView está respaldado por un CALayer y estoy bastante familiarizado con CALayer . Dicho esto, no estoy seguro de cuál es el performance o la forma correcta de hacerlo.

EDITAR: Agregar código de dibujo hexagonal.

Aquí crearé un código para crear un CGPathRef que representará un hexágono.

  UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; v.backgroundColor = [UIColor purpleColor]; CGRect rect = v.frame; CAShapeLayer *hexagonMask = [CAShapeLayer layer]; UIBezierPath *hexagonPath = [UIBezierPath bezierPath]; CGFloat sideWidth = 2 * ( 0.5 * rect.size.width / 2 ); CGFloat lcolumn = ( rect.size.width - sideWidth ) / 2; CGFloat rcolumn = rect.size.width - lcolumn; CGFloat height = 0.866025 * rect.size.height; CGFloat y = (rect.size.height - height) / 2; CGFloat by = rect.size.height - y; CGFloat midy = rect.size.height / 2; CGFloat rightmost = rect.size.width; [hexagonPath moveToPoint:CGPointMake(lcolumn, y)]; [hexagonPath addLineToPoint:CGPointMake(rcolumn, y)]; [hexagonPath addLineToPoint:CGPointMake(rightmost, midy)]; [hexagonPath addLineToPoint:CGPointMake(rcolumn, by)]; [hexagonPath addLineToPoint:CGPointMake(lcolumn, by)]; [hexagonPath addLineToPoint:CGPointMake(0, midy)]; [hexagonPath addLineToPoint:CGPointMake(lcolumn, y)]; hexagonMask.path = hexagonPath.CGPath; v.layer.mask = hexagonMask; 

Puede sustituir la vista de la image por v debería enmascararla automáticamente.

EDITAR: Listado de códigos para el hexágono con borde. Tenga en count que el ancho de línea en este ejemplo solo parece ser 2.5 ya que la mitad de ella se recortará. Si desea un borde real de 5 píxeles, especifique la línea lineWidth para que sea 10 .

  UIView *v = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; v.backgroundColor = [UIColor purpleColor]; CGRect rect = v.frame; CAShapeLayer *hexagonMask = [CAShapeLayer layer]; CAShapeLayer *hexagonBorder = [CAShapeLayer layer]; hexagonBorder.frame = v.layer.bounds; UIBezierPath *hexagonPath = [UIBezierPath bezierPath]; CGFloat sideWidth = 2 * ( 0.5 * rect.size.width / 2 ); CGFloat lcolumn = ( rect.size.width - sideWidth ) / 2; CGFloat rcolumn = rect.size.width - lcolumn; CGFloat height = 0.866025 * rect.size.height; CGFloat y = (rect.size.height - height) / 2; CGFloat by = rect.size.height - y; CGFloat midy = rect.size.height / 2; CGFloat rightmost = rect.size.width; [hexagonPath moveToPoint:CGPointMake(lcolumn, y)]; [hexagonPath addLineToPoint:CGPointMake(rcolumn, y)]; [hexagonPath addLineToPoint:CGPointMake(rightmost, midy)]; [hexagonPath addLineToPoint:CGPointMake(rcolumn, by)]; [hexagonPath addLineToPoint:CGPointMake(lcolumn, by)]; [hexagonPath addLineToPoint:CGPointMake(0, midy)]; [hexagonPath addLineToPoint:CGPointMake(lcolumn, y)]; hexagonMask.path = hexagonPath.CGPath; hexagonBorder.path = hexagonPath.CGPath; hexagonBorder.fillColor = [UIColor clearColor].CGColor; hexagonBorder.strokeColor = [UIColor blackColor].CGColor; hexagonBorder.lineWidth = 5; v.layer.mask = hexagonMask; [v.layer addSublayer:hexagonBorder];