iOS:Layer.mask属性用法

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的对象

原图:iOS:Layer.mask属性用法_第1张图片添加了一个子layer后:iOS:Layer.mask属性用法_第2张图片用子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裁剪:
原图: iOS:Layer.mask属性用法_第3张图片,添加一个label: iOS:Layer.mask属性用法_第4张图片
关键到了,直接裁剪: ,什么都没有;
加一行代码:

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:Layer.mask属性用法)