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