How can I "cut" a transparent hole in a UIImage?

I am trying to cut a transparent square in UIImage, but I honestly have to understand where / how to start.

Any help would be greatly appreciated.

Thanks!

+8
objective-c iphone cocoa-touch uiimage
source share
2 answers

Suppose your image is displayed in a view - probably a UIImageView. Then we can punch a rectangular hole in this view by masking the view layer. Each species has a layer. We will apply a mask to this presentation layer, which itself is a layer containing the image that we will generate in the code. The image will be black except for a transparent rectangle somewhere in the middle. This transparent rectangle will cause a hole in the image.

So let self.iv be a UIImageView. Try running this code:

 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; 

For example, in this image, the white square is not a superimposed square, this is the hole showing the white background of the window behind it:

enter image description here

EDIT . I feel obligated since I mentioned this in a comment to show how to do the same with CAShapeLayer. The result is exactly the same:

 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; 
+15
source share

Here's a simple Swift cut#hole#inView for copy and paste for 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 } 
+5
source share

All Articles