Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a single CALayer be used as the mask for multiple other layers?

I can't find anything in the docs that indicates whether a single CALayer (or subclass) can be used as the mask property for multiple other layers. Is it possible? Or undefined?

like image 441
Travis Griggs Avatar asked Nov 12 '14 00:11

Travis Griggs


2 Answers

My experimentation says that it cannot. It will end up as the mask for the last layer it is attached to, and any previous layers it was assigned as a mask to, will revert to the default value of mask.

like image 63
Travis Griggs Avatar answered Sep 24 '22 18:09

Travis Griggs


It is possible. I combined mask of CAGradationLayer and CAShapeLayer.

I made UIImage from two layers, and I use it to mask.

You can generate image from CALayer like below.

extension CALayer {
    func makeImage() -> UIImage {
        UIGraphicsBeginImageContext(self.frame.size)
        self.renderInContext(UIGraphicsGetCurrentContext())
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

and You can mask by multiple layers.

firstMask.mask = secondMask
let img = firstMask.makeImage()// require firstMask.frame

let combinedMask = CALayer()
combinedMask.frame = CGRectMake(0,0, img.size.width, img.size.height)
combinedMask.contents = img.CGImage

yourLayer.mask = combinedMask
like image 42
taku_oka Avatar answered Sep 24 '22 18:09

taku_oka