Can a single CALayer be used as the mask for multi

2020-03-18 03:14发布

问题:

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?

回答1:

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.



回答2:

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