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:
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 }