¿Cómo puedo ‘cortar’ un agujero transparente en un UIImage?

Intento cortar un cuadrado transparente en un UIImage, sin embargo, sinceramente, tengo que imaginar dónde y cómo comenzar.

Cualquier ayuda sería muy apreciada.

¡Gracias!

Supongamos que su imagen se muestra en una vista, probablemente un UIImageView. Luego podemos perforar un agujero rectangular en esa vista enmascarando la capa de la vista . Cada vista tiene una capa. Aplicaremos a la capa de esta vista una máscara que a su vez es una capa que contiene una imagen, que generaremos en el código. La imagen será negra excepto por un rectángulo claro en algún lugar en el medio. Ese rectángulo transparente causará el agujero en la vista de la imagen.

Entonces, deja que self.iv sea ​​este UIImageView. Intenta ejecutar este código:

 CGRect r = self.iv.bounds; CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired! UIGraphicsBeginImageContextWithOptions(r.size, NO, 0); CGContextRef c = UIGraphicsGetCurrentContext(); CGContextAddRect(c, r2); CGContextAddRect(c, r); CGContextEOClip(c); CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor); CGContextFillRect(c, r); UIImage* maskim = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CALayer* mask = [CALayer layer]; mask.frame = r; mask.contents = (id)maskim.CGImage; self.iv.layer.mask = mask; 

Por ejemplo, en esta imagen, el cuadrado blanco no es un cuadrado superpuesto, es un agujero, que muestra el fondo blanco de la ventana detrás de él:

enter image description here

EDITAR : Me siento obligado, como lo mencioné en un comentario, a mostrar cómo hacer lo mismo con un CAShapeLayer. El resultado es exactamente el mismo:

 CGRect r = self.iv.bounds; CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired! CAShapeLayer* lay = [CAShapeLayer layer]; CGMutablePathRef path = CGPathCreateMutable(); CGPathAddRect(path, nil, r2); CGPathAddRect(path, nil, r); lay.path = path; CGPathRelease(path); lay.fillRule = kCAFillRuleEvenOdd; self.iv.layer.mask = lay; 

Aquí hay una función simple Swift cut#hole#inView para copiar y pegar para 2017

 func cut(hole: CGRect, inView v: UIView) { let p:CGMutablePath = CGMutablePath() p.addRect(inView.bounds) p.addRect(hole) let s = CAShapeLayer() s.path = p s.fillRule = kCAFillRuleEvenOdd v.layer.mask = s }