user339946
user339946

Reputation: 6119

Create a masking layer without direct image processing?

I'm basically trying to achieve this effect. It can be done with pretty much a PNG with a transparent hole cut through it, then stacked on top of a photo.jpg UIView. OR, I've also seen a method where you can directly create a mask with CGImageMaskCreate. I don't want to use that feature because I want the user to be able to interact with the photo.jpg layer (by moving it, rotating it, etc.):

enter image description here

Its essentially two UIViews stacked directly on top of each other.

However, what if rather than using blue, I wanted to use another color, or even pattern an image with [UIColor colorPatternWithImage:] for the masking layer? I wouldn't want to make a million different PNGs for each case.

Would I need some way to programmatically recreate my mask? Is there some way to convert my mask shapes into code? Any help is appreciated. Thanks

Upvotes: 0

Views: 384

Answers (1)

Lily Ballard
Lily Ballard

Reputation: 185811

CALayer has a property called mask, which is another CALayer that defines the mask to use. You could use a CAShapeLayer to define the mask, then set that as the mask of another layer that renders your obscuring image/color/pattern/whatever. You could also use a regular CALayer as the mask with your semi-transparent image as the contents, it depends on whether or not you want the ability to customize the size/shape of the hole.

Caveats: CAShapeLayer is slower than normal layers, and mask is slower than non-masking as well. You may need to make sure performance is acceptable for you. You may also want to try out the shouldRasterize flag, though this will only improve performance (at the cost of memory) as long as the layer is static (i.e. not animating).

Upvotes: 4

Related Questions