美文网首页
iOS - CALayer的mask属性学习

iOS - CALayer的mask属性学习

作者: 恋空K | 来源:发表于2020-05-20 17:30 被阅读0次

mask就是PS中的遮罩;
遮罩层必须至少有两个图层,上面的一个图层为“遮罩层”,下面的称“被遮罩层”;这两个图层中只有相重叠的地方才会被显示。也就是说在遮罩层中有对象的地方就是“透明”的,可以看到被遮罩层中的对象,而没有对象的地方就是不透明的,被遮罩层中相应位置的对象是看不见的。
实例一:字体渐变的UILabel

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(100, 300, 200, 25);
    [gradientLayer setStartPoint:CGPointMake(0.0, 0.0)];
    [gradientLayer setEndPoint:CGPointMake(0.0, 1.0)];
    gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor yellowColor].CGColor,(id)[UIColor greenColor].CGColor];
    
    UILabel *label = [[UILabel alloc] initWithFrame:gradientLayer.bounds];
    label.text = @"红黄绿渐变~~";
    label.font = [UIFont boldSystemFontOfSize:25];
    label.backgroundColor = [UIColor clearColor];
    [self.view addSubview:label];
    
    [self.view.layer addSublayer:gradientLayer];
    gradientLayer.mask = label.layer;

效果图:



说明:

这里首先要弄清楚的是,哪个是哪个的遮罩层;

根据遮罩的概念,分析:两个图层中重叠的部分才被显示,gradientLayer渐变层显示的部分是一整块形状,而label显示的部分只有字体(默认黑色),背景我们已经清除掉颜色了;继续,“遮罩层”中有对象的地方就是“透明”的,可以看到“被遮罩层”中的对象,而没有对象的地方就是不透明的,被遮罩层中相应位置的对象是看不见的;假设gradientLayer是遮罩层,那么它的所有区域都是有对象的,因此它整块都是透明的,我们能看到的是整个label,也就是这个gradientLayer根本就不作用,可有可无,然后,我们把label作为遮罩层,它有对象的区域就是它的文字部分,这个文字部分是透明的,正好我们透过文字看到gradientLayer的渐变颜色,而没有对象的部分不透明,我们在脑海里把它裁剪掉,最后正好是我们的效果图的样子;

实例二:颜色渐变的图片

![](https://img.haomeiwen.com/i7205173/fd8dfcc8d6d03015.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.frame = CGRectMake(100, 300, 150, 50);
    gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor yellowColor].CGColor,(id)[UIColor greenColor].CGColor];
    [gradientLayer setStartPoint:CGPointMake(0.0, 0.0)];
    [gradientLayer setEndPoint:CGPointMake(0.0, 1.0)];
    
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:gradientLayer.bounds];
    imageView.image = [UIImage imageNamed:@"Map_help_button"];
    [self.view addSubview:imageView];
    
    [self.view.layer addSublayer:gradientLayer];
    gradientLayer.mask = imageView.layer;
遮罩后效果图:

实例三:通过CAShapeLayer实现图片的裁剪

原始图片:
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    imageView.center = self.view.center;
    imageView.image = [UIImage imageNamed:@"Share_bag"];
    [self.view addSubview:imageView];
    
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50)
                                                        radius:100 / 2.f
                                                    startAngle:0
                                                      endAngle:M_PI*2
                                                     clockwise:YES];
 
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = imageView.bounds;
    maskLayer.path = path.CGPath;
 
    [self.view.layer addSublayer:maskLayer];
    imageView.layer.mask = maskLayer;
裁剪后的效果图:

说明:

这里只是通过这个例子讲解mask的使用,图片的圆角裁剪实际上只需要修改cornerRadius属性即可;

在这里,原始图片作为被遮罩层,maskLayer作为遮罩层,maskLayer的形状正好的是图片大小的圆,这个圆通过贝塞尔路径来构造;两个层一叠加,显示重叠部分,maskLayer有对象的部分也就是圆形部分透明,其他部分不透明,就得到上面的效果图;

CALayer有一个属性叫做mask可以解决这个问题。这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。不同于那些绘制在父图层中的子图层,mask图层定义了父图层的部分可见区域。
mask图层的Color属性是无关紧要的,真正重要的是图层的轮廓。mask属性就像是一个饼干切割机,mask图层实心的部分会被保留下来,其他的则会被抛弃。(如图4.12)
如果mask图层比父图层要小,只有在mask图层里面的内容才是它关心的,除此以外的一切都会被隐藏起来。

首先mask这个属性属于CALayer及其子类,另外mask这个属性本身就是一个CALayer,所以我们如果要给一个对象设置mask那么这个对象本身一定要是CALayer及其子类,另外设置mask属性的时候,这个mask本身也一定要是CALayer及其子类。

当给一个对象添加了mask属性的时候,这个对象是mask这个层的父视图,对于mask来说,它本身的颜色并不重要,重要的是它的轮廓(即外形),对于父图层来说mask属性定义了父图层显示的区域,mask层实心的地方会被保留下来,其他的地方会被抛弃。(可以这么理解,我向view上添加了一个矩形的涂层,当我给这个矩形涂层设置了一个mask属性之后,如果这个mask层的外观是三角形,那么这个矩形的父视图也会变成三角形,因为mask定义了父视图的显示区域。

相关文章

  • iOS - CALayer的mask属性学习

    mask就是PS中的遮罩;遮罩层必须至少有两个图层,上面的一个图层为“遮罩层”,下面的称“被遮罩层”;这两个图层中...

  • CALayer的mask属性

    CALayer的mask属性俗称蒙版。@property(nullable, strong) CALayer *m...

  • CALayer属性mask

    CALayer的属性mask,mask也是一个layer,这边称它为maskLayer。介绍中描述 An opti...

  • CALayer之mask使用

    mask是CALayer的一个属性,它本身也是一个CALayer类。mask有和其他图层一样的绘制和布局属性。它类...

  • 自定义转场动画-小圆点扩散

    mask的理解 CALayer有一个属性叫做mask。比如imageLayer有一个maskLayer作为mask...

  • CALayer的mask属性

    之前对mask属性了解的特别少,今天特意来看看其用法:*********mask就是PS中的遮罩;********...

  • iOS CALayer的属性mask的使用

    举例说明 要实现的效果: 实现思路: 分析:CALayer的mask图层, 是以透明度为基础的, 只看透明度, 即...

  • 547,CALayer之mask属性-遮罩(面试点:mask属性

    CALayer有一个属性叫做mask。 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。 ...

  • CALayer之mask属性-遮罩

    CALayer有一个属性叫做mask。 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。 ...

  • SplashAnimation

    涉及到的技术点CALayer的mask属性mask 也是一个 CALayer当我们使用时,就需要单独创建一个 CA...

网友评论

      本文标题:iOS - CALayer的mask属性学习

      本文链接:https://www.haomeiwen.com/subject/lgpnohtx.html