ios UIView的mask属性,view和layer的关系
mask属性 : https://www.jianshu.com/p/fe4124de3729
view和layer的关系 : https://www.jianshu.com/p/9c7a23ea705b
什么是mask:
CALayer有一个属性叫做mask,通常被称为蒙版图层,mask类似于子视图,但却不是一个普通的子视图,它本身也是CALayer类型,具有和其他图层一样的绘制和布局属性。
mask 的作用就是让父图层与mask重叠的部分区域可见 , 通俗的说就是mask图层实心的部分将会被保留下来,mask的其余部分则会被抛弃。
self.view.backgroundColor = [UIColor cyanColor];
UIView * red = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 414, 600)];
red.backgroundColor = [UIColor redColor];
[self.view addSubview:red];
// mask所在区域会显示,不在区域不显示,类似于透明度为0
//UIBezierPath *bpath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:100 startAngle:0 endAngle:2*M_PI clockwise:NO];
UIBezierPath *bpath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = bpath.CGPath;
//添加图层蒙板
red.layer.mask = shapeLayer;
文章图片
【ios UIView的mask属性,view和layer的关系】1.mask 的backgroundColor必须设置,不设置mask 背景就是透明的,mask 是不会起作用的,但是backgroundColor设置什么颜色无所谓。
CALayer * layer = [CALayer layer];
layer.frame = CGRectMake(100, 100, 100, 100);
// 注释了下面在设置mask就无效了
layer.backgroundColor = [UIColor orangeColor].CGColor;
red.layer.mask = layer;
2.为一个layer的mask 创建一个新的mask时,这个新的mask不能有superlayer 和sublayer。(官方文档的说明)
3.mask 可以配合CAGradientLayer、CAShapeLayer 使用。可以实现蒙层透明度、显示不同形状图层、图案镂空、文字变色等等功能。
4.mask在动画中使用,可以产生很好的动画效果。
文章图片
说下 UIView和layer的关系
1. UIView不具备显示功能,拥有显示功能的是它内部的图层即CALayer属性
当UIView需要显示到屏幕上时,会调用DrawRect:方法进行绘图,并且将所有的内容绘制在自己的图层上CALayer *layer,绘图完成后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示
UIView 的Layer属性在系统内部,被维护着三份拷贝。分别是逻辑树,这里是代码可以操作的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上的内容
UIView 本身更像是一个CALayer的管理器,UIView 有个属性CALayer *layer ,所有从UIView继承的对象都继承了该属性。因此,可以通过layer 属性对view 进行 转换、缩放、旋转等操作 .
2.UIView可以响应事件,Layer不可以.
UIKit使用UIResponder作为响应对象,来响应系统传递过来的事件并进行处理。UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。
在 UIResponder中定义了处理各种事件和事件传递的接口, 而 CALayer直接继承 NSObject,并没有相应的处理事件的接口。
I、下面就展示一下mask 高级的用法:
核心代码部分如下:
文章图片
II、下面展示的是和CAShapeLayer结合使用的情况
- (UIView*)shapeView {if(_shapeView==nil) {_shapeView = [[UIView alloc] initWithFrame:CGRectMake(50, 200, UIScreen.mainScreen.bounds.size.width - 50*2, 200)];
_shapeView.backgroundColor = UIColor.grayColor;
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:_shapeView.bounds];
shapeLayer.path= bezierPath.CGPath;
shapeLayer.strokeStart=0.0;
shapeLayer.strokeEnd=1.0;
shapeLayer.fillColor = UIColor.orangeColor.CGColor;
shapeLayer.lineWidth=1.5;
[_shapeView.layer addSublayer:shapeLayer];
//_shapeView.layer.mask= shapeLayer;
>>>>>>>>>>>>>>>>>>>>>AAA行}return _shapeView;
}
上面这段代码就是mask 和 CAShapeLayer 结合使用的简单示例:
上面代码AAA行注释掉的情况
文章图片
shapeLayer 没有赋值给mask情况
上面代码AAA没有注释掉的情况:
文章图片
mask被赋值了shapeLayer的情况
通过这两张图对比可以看出mask 和shapeLayer结合使用,可以在父图层上显示你想要的图形,而父图层的其它部分,则被隐去了 。
III、扩展
使用layer的mask属性实现注水动画效果
图片来之网络
mask和shapeLayer 结合 实现的圆形动画加载
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量