Como posso ‘cortar’ um buraco transparente em um UIImage?

Eu estou tentando cortar um quadrado transparente em um UIImage, no entanto, eu honestamente tenho que saber onde / como começar.

Qualquer ajuda seria muito apreciada.

Obrigado!

Presuma que sua imagem está sendo exibida em uma visão – provavelmente um UIImageView. Então, podemos perfurar um furo retangular naquela vista, mascarando a camada da vista . Toda visão tem uma camada. Aplicaremos à camada dessa visão uma máscara que é em si uma camada contendo uma imagem, a qual geraremos no código. A imagem ficará preta, exceto por um retângulo claro em algum lugar no meio. Esse retângulo claro causará o furo na visualização da imagem.

Então, deixe self.iv ser esse UIImageView. Tente executar 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 exemplo, nesta imagem, o quadrado branco não é um quadrado sobreposto, é um buraco, mostrando o branco do fundo da janela atrás dele:

insira a descrição da imagem aqui

EDIT : Sinto-me obrigado, desde que eu mencionei em um comentário, para mostrar como fazer a mesma coisa com um CAShapeLayer. O resultado é exatamente o mesmo:

 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; 

Aqui está uma simples function Swift cut#hole#inView para copiar e colar 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 }