iOS:Layer.mask属性用法
2016-01-18 19:11
1196 查看
Core Animation里面的CALayer已经被说烂了,这里就不加赘述了。
需要说明两点:
1.Layer跟UIView之间的关系可以这么理解,只有root layer才是真正跟view打交道的,一个view并不代表一个layer;
2.layer的坐标系统,anchorPoint这个是相对于自身而言的,position是相对于父layer而言的;
另外:创建一个最简单的layer,需要5步:
CALayer *layer=[[CALayeralloc]init];//layer
layer.position=CGPointMake(50,50);//anchorPoint在父layer中的位置
layer.bounds=CGRectMake(0,0,30,
30);//大小
layer.backgroundColor=[UIColorredColor].CGColor;//颜色
[self.view.layeraddSublayer:layer];//加到父layer上
边框(向内缩进):borderWidth+borderColor
layer.borderWidth=3;
layer.borderColor=[UIColorpurpleColor].CGColor;
圆角:cornerRadius CGFloat值表示圆半径
_layer1.cornerRadius=45;
阴影:shadowOpacity+shadowOffset+shadowColor
layer.shadowColor=[UIColorblackColor].CGColor;
layer.shadowOffset=CGSizeMake(10,10);
layer.shadowOpacity=1;
另外还有一个masksToBounds需要知道:
layer.masksToBounds=YES;//切掉超出的部分
下面进入正题:mask:在被mask的对象上留下mask对象非空白的部分(被mask对象.mask=mask对象;)
1.子layer作为mask的对象
原图:
![](http://img.blog.csdn.net/20160118202624944?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
添加了一个子layer后:
![](http://img.blog.csdn.net/20160118202809898?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
用子layer裁剪:
![](http://img.blog.csdn.net/20160118202948367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
码:
{//看效果
CALayer *layer22=[[CALayeralloc]init];
[_layer2addSublayer:layer22];
layer22.anchorPoint=CGPointMake(0,0);
layer22.position=CGPointMake(15,15);
layer22.bounds=CGRectMake(0,0,60,
60);
layer22.backgroundColor=[UIColorpurpleColor].CGColor;
_layer2.mask=layer22;
}
2.其他layer裁剪:
原图:
![](http://img.blog.csdn.net/20160118203215400?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
,添加一个label:
![](http://img.blog.csdn.net/20160118203248650?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
关键到了,直接裁剪:
![](http://img.blog.csdn.net/20160118203430432?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
,什么都没有;
加一行代码:
label.frame=_layer1.bounds;
看结果:
![](http://img.blog.csdn.net/20160118203546682?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
与上面的字的位置并不一样,换:
label.frame=CGRectMake(10,25,100,
50);
结果:
![](http://img.blog.csdn.net/20160118203720417?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
码:
{
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(110,325,100,50)];
label.text=@"LivesXu";
label.textColor=[UIColoryellowColor];
[self.viewaddSubview:label];
_layer2.mask=label.layer;
// label.frame=_layer1.bounds;
label.frame=CGRectMake(10,25,100,
50);
}
总结:
1.mask,遮盖的结果是:在被mask的对象上留下mask对象非空白的部分(被mask对象.mask=mask对象;)
这个效果常常配合CAGradientLayer使用做出变色字,也就是动态的上面LivesXu的效果;
2.mask的核心思想在于:mask对象在这行代码(被mask对象.mask=mask对象;)执行完之后坐标系发生的改变,被假设性的放置在了被mask对象上面,并且frame没有相应的变化,所以导致了用外部的layer直接裁剪会出现空白的情况,当然如果是子layer裁剪那么就一点问题没有;因此,需要在(被mask对象.mask=mask对象;)之后追加一个控制mask对象frame的语句,给它一个位置。(需要注意:mask对象其实是被从自己曾今的父视图或者父layer上被移除了,而且也没到被mask的那个layer上去)。
综码:
- (void)viewDidLoad {
[superviewDidLoad];
{
// CALayer *rootLayer=self.view.layer;
NSArray *colorArray=@[[UIColorredColor],
[UIColorgreenColor],
[UIColoryellowColor],
[UIColorblueColor],
];
NSMutableArray *arrayLayer=[NSMutableArrayarray];
for (NSInteger i=1; i<5;
i++) {
UIView *view=[[UIViewalloc]initWithFrame:CGRectMake(100,100+100*i,90,
90)];
view.backgroundColor=colorArray[i-1];
CALayer *layer=view.layer;
layer.shadowColor=[UIColorblackColor].CGColor;
layer.shadowOffset=CGSizeMake(10,10);
layer.shadowOpacity=1;
layer.borderWidth=3;
layer.borderColor=[UIColorpurpleColor].CGColor;
[arrayLayeraddObject:layer];
[self.viewaddSubview:view];
}
_layer2=arrayLayer[1];
_layer2.cornerRadius=20;
CALayer *layer21=[[CALayeralloc]init];
[_layer2addSublayer:layer21];
layer21.anchorPoint=CGPointMake(0,0);
layer21.position=CGPointMake(10,10);
layer21.bounds=CGRectMake(0,0,40,
40);
layer21.backgroundColor=[UIColorblueColor].CGColor;
layer21.shadowOpacity=1;
layer21.shadowColor=[UIColorredColor].CGColor;
layer21.shadowOffset=CGSizeMake(15,15);
layer21.cornerRadius=5;
// _layer2.masksToBounds=YES;
// {//看效果
CALayer *layer22=[[CALayeralloc]init];
[_layer2addSublayer:layer22];
layer22.anchorPoint=CGPointMake(0,0);
layer22.position=CGPointMake(15,15);
layer22.bounds=CGRectMake(0,0,60,
60);
layer22.backgroundColor=[UIColorpurpleColor].CGColor;
// _layer2.mask=layer22;
// }
//
{
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(110,325,100,50)];
label.text=@"LivesXu";
label.textColor=[UIColoryellowColor];
[self.viewaddSubview:label];
NSInteger j=0;
for (CALayer *layerin_layer2.sublayers)
{
NSLog(@"%@",layer);
j++;
}
NSLog(@"j==%ld",j);
_layer2.mask=label.layer;
// label.frame=_layer1.bounds;
label.frame=CGRectMake(10,25,100,
50);
NSArray *array= self.view.subviews;
for (UIView *viewin array) {
Class c=NSClassFromString(@"UILabel");
if ([viewisKindOfClass:c]) {
NSLog(@"label还在");
}
}
// _layer2.sublayers;
NSInteger i=0;
for (CALayer *layerin_layer2.sublayers)
{
NSLog(@"%@",layer);
i++;
}
NSLog(@"i==%ld",i);
}
}
需要说明两点:
1.Layer跟UIView之间的关系可以这么理解,只有root layer才是真正跟view打交道的,一个view并不代表一个layer;
2.layer的坐标系统,anchorPoint这个是相对于自身而言的,position是相对于父layer而言的;
另外:创建一个最简单的layer,需要5步:
CALayer *layer=[[CALayeralloc]init];//layer
layer.position=CGPointMake(50,50);//anchorPoint在父layer中的位置
layer.bounds=CGRectMake(0,0,30,
30);//大小
layer.backgroundColor=[UIColorredColor].CGColor;//颜色
[self.view.layeraddSublayer:layer];//加到父layer上
边框(向内缩进):borderWidth+borderColor
layer.borderWidth=3;
layer.borderColor=[UIColorpurpleColor].CGColor;
圆角:cornerRadius CGFloat值表示圆半径
_layer1.cornerRadius=45;
阴影:shadowOpacity+shadowOffset+shadowColor
layer.shadowColor=[UIColorblackColor].CGColor;
layer.shadowOffset=CGSizeMake(10,10);
layer.shadowOpacity=1;
另外还有一个masksToBounds需要知道:
layer.masksToBounds=YES;//切掉超出的部分
下面进入正题:mask:在被mask的对象上留下mask对象非空白的部分(被mask对象.mask=mask对象;)
1.子layer作为mask的对象
原图:
添加了一个子layer后:
用子layer裁剪:
码:
{//看效果
CALayer *layer22=[[CALayeralloc]init];
[_layer2addSublayer:layer22];
layer22.anchorPoint=CGPointMake(0,0);
layer22.position=CGPointMake(15,15);
layer22.bounds=CGRectMake(0,0,60,
60);
layer22.backgroundColor=[UIColorpurpleColor].CGColor;
_layer2.mask=layer22;
}
2.其他layer裁剪:
原图:
,添加一个label:
关键到了,直接裁剪:
,什么都没有;
加一行代码:
label.frame=_layer1.bounds;
看结果:
与上面的字的位置并不一样,换:
label.frame=CGRectMake(10,25,100,
50);
结果:
码:
{
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(110,325,100,50)];
label.text=@"LivesXu";
label.textColor=[UIColoryellowColor];
[self.viewaddSubview:label];
_layer2.mask=label.layer;
// label.frame=_layer1.bounds;
label.frame=CGRectMake(10,25,100,
50);
}
总结:
1.mask,遮盖的结果是:在被mask的对象上留下mask对象非空白的部分(被mask对象.mask=mask对象;)
这个效果常常配合CAGradientLayer使用做出变色字,也就是动态的上面LivesXu的效果;
2.mask的核心思想在于:mask对象在这行代码(被mask对象.mask=mask对象;)执行完之后坐标系发生的改变,被假设性的放置在了被mask对象上面,并且frame没有相应的变化,所以导致了用外部的layer直接裁剪会出现空白的情况,当然如果是子layer裁剪那么就一点问题没有;因此,需要在(被mask对象.mask=mask对象;)之后追加一个控制mask对象frame的语句,给它一个位置。(需要注意:mask对象其实是被从自己曾今的父视图或者父layer上被移除了,而且也没到被mask的那个layer上去)。
综码:
- (void)viewDidLoad {
[superviewDidLoad];
{
// CALayer *rootLayer=self.view.layer;
NSArray *colorArray=@[[UIColorredColor],
[UIColorgreenColor],
[UIColoryellowColor],
[UIColorblueColor],
];
NSMutableArray *arrayLayer=[NSMutableArrayarray];
for (NSInteger i=1; i<5;
i++) {
UIView *view=[[UIViewalloc]initWithFrame:CGRectMake(100,100+100*i,90,
90)];
view.backgroundColor=colorArray[i-1];
CALayer *layer=view.layer;
layer.shadowColor=[UIColorblackColor].CGColor;
layer.shadowOffset=CGSizeMake(10,10);
layer.shadowOpacity=1;
layer.borderWidth=3;
layer.borderColor=[UIColorpurpleColor].CGColor;
[arrayLayeraddObject:layer];
[self.viewaddSubview:view];
}
_layer2=arrayLayer[1];
_layer2.cornerRadius=20;
CALayer *layer21=[[CALayeralloc]init];
[_layer2addSublayer:layer21];
layer21.anchorPoint=CGPointMake(0,0);
layer21.position=CGPointMake(10,10);
layer21.bounds=CGRectMake(0,0,40,
40);
layer21.backgroundColor=[UIColorblueColor].CGColor;
layer21.shadowOpacity=1;
layer21.shadowColor=[UIColorredColor].CGColor;
layer21.shadowOffset=CGSizeMake(15,15);
layer21.cornerRadius=5;
// _layer2.masksToBounds=YES;
// {//看效果
CALayer *layer22=[[CALayeralloc]init];
[_layer2addSublayer:layer22];
layer22.anchorPoint=CGPointMake(0,0);
layer22.position=CGPointMake(15,15);
layer22.bounds=CGRectMake(0,0,60,
60);
layer22.backgroundColor=[UIColorpurpleColor].CGColor;
// _layer2.mask=layer22;
// }
//
{
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(110,325,100,50)];
label.text=@"LivesXu";
label.textColor=[UIColoryellowColor];
[self.viewaddSubview:label];
NSInteger j=0;
for (CALayer *layerin_layer2.sublayers)
{
NSLog(@"%@",layer);
j++;
}
NSLog(@"j==%ld",j);
_layer2.mask=label.layer;
// label.frame=_layer1.bounds;
label.frame=CGRectMake(10,25,100,
50);
NSArray *array= self.view.subviews;
for (UIView *viewin array) {
Class c=NSClassFromString(@"UILabel");
if ([viewisKindOfClass:c]) {
NSLog(@"label还在");
}
}
// _layer2.sublayers;
NSInteger i=0;
for (CALayer *layerin_layer2.sublayers)
{
NSLog(@"%@",layer);
i++;
}
NSLog(@"i==%ld",i);
}
}
相关文章推荐
- iOS Provisioning Profile(Certificate)与Code Signing详解
- iOS 拨打电话,发短信
- iOS 字符串类目,多种与字符串相关的方法。
- iOS开发ARC内存管理技术要点
- iOS的加急审核
- iOS给Navigation的BarButton的加消息提醒角标
- iOS 通过 JSPatch 实时修复线上 bug!
- ios 弹出键盘 视图向上平移
- iOS开发 常用插件、工具
- IOS8解决获取位置坐标信息出错(Error Domain=kCLErrorDomain Code=0)
- [IOS]调色板
- IOS添加pch全局引用文件(宏定义)
- iOS开发-automaticallyAdjustsScrollViewInsets属性
- iOS开发之Masonry(三)
- iOS开发代理的实现
- iOS 【Multithreading-GCD 延时执行操作】
- iOS文档注释
- IOS一个漂亮的书架
- iOS 日期与字符串格式互转
- iOS url编码、解码