CALayer的mask属性简介

来源:互联网 发布:日本投资房产 知乎 编辑:程序博客网 时间:2024/05/27 00:28

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的渐变颜色,而没有对象的部分不透明,我们在脑海里把它裁剪掉,最后正好是我们的效果图的样子;


实例二:颜色渐变的图片

原始图片效果图:


    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有对象的部分也就是圆形部分透明,其他部分不透明,就得到上面的效果图;



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泰国出境单丢了怎么办 居住证到期了忘记续签了怎么办 贵州交警app忘记密码怎么办 科一第一次没过怎么办 社保转移时学历信息不符怎么办 天津摇号密码忘了怎么办 摇号账号密码忘了怎么办 京牌车去外地没有保险标怎么办 车子被扣12分怎么办 不在北京工作了社保怎么办 5年身份证到期了怎么办 c1驾照剩1分怎么办 c1驾校扣12分怎么办 我驾照扣了12分怎么办 小米手环绑定不了怎么办 小区总有小年青骑摩托车扰民怎么办 摩托车行驶证副本丢了怎么办 摩托车驾照副本丢了怎么办 公司行驶证掉了怎么办 身份证外迁了过户的话怎么办 驾照体检报告丢了怎么办 常州医保卡丢了怎么办 驾驶证违章罚单丢了怎么办 身份证被别人办了信用卡怎么办 被别人办了信用卡怎么办 考驾照体检忘带身份证怎么办 c证扣12分怎么办新规 c照12分不够扣怎么办 扣了18分怎么办一次性 c照累计扣12分怎么办 车辆超速扣12分怎么办 一次超速扣12分怎么办 分扣了罚款未交怎么办 c照一次扣12分怎么办 人在外地身份证到期了怎么办 手机进水了屏幕不亮怎么办 北京一证通过期怎么办 小米6音量键进水怎么办 考驾照怕过不了怎么办 学车对车没感觉怎么办 居住证到期2个月怎么办