mask
Property
An optional layer whose alpha channel is used to mask the layer’s content.
Discussion
The layer’s alpha channel determines how much of the layer’s content and background shows through. Fully or partially opaque pixels allow the underlying content to show through but fully transparent pixels block that content.
The default value of this property is nil nil. When configuring a mask, remember to set the size and position of the mask layer to ensure it is aligned properly with the layer it masks.
Special Considerations
The layer you assign to this property must not have a superlayer. If it does, the behavior is undefined.
Availability
Available in iOS 3.0 and later.
以上是Mask 在Apple的的官方文档中的描述,不难看出Mask在一般情况下是不存在,默认是nil.Mask 相当于一个遮盖,覆盖在视图Layer的上层,如果将视图Layer称之为ContentLayer
,可以通过控制Mask 的opacity(=alpha)
,bounds
和<path>路径
来控制ContentLayer
的显示范围和透明度
在Mask 范围之外的ContentLayer
将不被显示(相当于没有绘制在屏幕上,可以看到ContentLayer
背后的视图)
在Mask 范围之内的ContentLayer = ContentLayer的opacity * **Mask**的opacity
,也就意味着Mask 的opacity
为0或1时ContentLayer
显示或不显示,当其为0.x时ContentLayer
为半透明状态
特别需要注意的是,Mask 的背景色为clearColor
也会被认为时opacity
为0
官方文档中已经警告:当你给Mask赋值时需要注意Mask不能拥有superLayer,否者Mask将会失效产生意想不到的后果
机智的小伙伴们可以发现Mask并没有指定图层类型,在大纲中,我们已经知道了CALayer的类型有很多种,这样的话就可以利用一些特殊的图层实现一些新奇的动画效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 import UIKitclass ViewController : UIViewController { var myImageView:UIImageView ! var maskLayer:CAShapeLayer ! override func viewDidLoad () { super .viewDidLoad() setupUI() } func setupUI () { let image = UIImage (named: "_snqARKTgoc" ) let inputImage = CIImage (CGImage: image! .CGImage !) let filter = CIFilter (name: "CIColorControls" ) filter? .setValue(inputImage, forKey: "inputImage" ) filter? .setValue(0.5 , forKey: "inputBrightness" ) let outputImage = UIImage (CIImage: filter! .outputImage! ) let bgImageView = UIImageView () bgImageView.image = outputImage bgImageView.frame = CGRectMake (0 , 0 , self .view.bounds.size.width, self .view.bounds.size.width * (image! .size.height/ image! .size.width)); bgImageView.center = CGPointMake (self .view.center.x, self .view.center.y - 1 ) self .view.addSubview(bgImageView) let imageView = UIImageView () imageView.image = image imageView.frame = CGRectMake (0 , 0 , self .view.bounds.size.width, self .view.bounds.size.width * (image! .size.height/ image! .size.width)); myImageView = imageView imageView.center = self .view.center self .view.addSubview(imageView) let shapLayer = CAShapeLayer () let path = CGPathCreateMutable () maskLayer = shapLayer shapLayer.bounds = CGRectMake (0 , 0 , 100 , 100 ) CGPathAddEllipseInRect (path, nil , CGRectMake (0 , 0 , 100 , 100 )) shapLayer.opacity = 0.5 shapLayer.position = CGPointMake (200 , 100 ) shapLayer.path = path shapLayer.fillColor = UIColor .blackColor().CGColor imageView.layer.mask = shapLayer } override func touchesBegan (touches : Set <UITouch >, withEvent event : UIEvent ?) { for touch in touches { let touchPoint = touch.locationInView(self .view) if self .myImageView.frame.contains(touchPoint) { let realPoint = touch.locationInView(self .myImageView) maskLayer.position = realPoint } } } override func didReceiveMemoryWarning () { super .didReceiveMemoryWarning() } }
#####扩展:
使用其他的图层(CAGradientLayer
)可以实现更多炫酷的效果,如iPhone的左滑解锁字体高亮,详细的实现方式会在后续的篇幅中结合CAGradientLayer
一块总结