Mask MaskView

關於CALayer中的mask(遮罩) 和 View中的maskView(遮罩view)的理解;

1.首先說一下關於我對遮罩的理解吧

  第一:遮罩我感覺就是當遮罩層的alpha通道爲0的時候就是透明的,反之則顯示,只是背景色變爲被遮罩層的背景色,(感覺跟PS中的蒙版差不多原理);

  第二:例子,假設,我這邊有A,B2個View,其中A的背景色爲純綠色,B爲label,text=@“我是遮罩層”;

      然後就可以A.maskView = B;那麼就把B看做是A的遮罩層(MaskView),最終的顯示結果是,顯示的字爲綠色的“我是遮罩層”,

  額,大概的效果就是這樣子,具體的話,代碼來實現以下吧

  maskView:

 //遮罩背景層,相當於A層
    UIView *maskView = [[UIView  alloc]initWithFrame:self.gradientLabel.frame];
    maskView.backgroundColor = [UIColor redColor];
    [self.view addSubview:maskView];
    [self.view addConstraints:[self getLayoutConstraintWithView:maskView SupperView:self.gradientLabel Inset:UIEdgeInsetsMake(0, 30, 0, 120)]];
    
    //遮罩層 相當於B層
    UILabel *newLabel = [[UILabel alloc]init];
    newLabel.numberOfLines = 0;
    newLabel.text = @"LabelLabelLabelLabel";
    //關於這個,遮罩層要不要ADD進父視圖,額,我這邊的實驗結果是可以不ADD進去,當然ADD進父視圖貌似也沒有影響
//    [self.view addSubview:newLabel];
//    [self.view addConstraints:[self getLayoutConstraintWithView:newLabel SupperView:self.gradientLabel Inset:UIEdgeInsetsZero]];
    maskView.maskView = newLabel;
    
    //設置了mask之後,一定要記住,重新設置B層的frame,此時可以看成B層是A層的subView來定位
    CGRect frame = self.gradientLabel.bounds;
    frame.origin.x = -30;
    frame.size.width += 30;
    newLabel.frame = frame;

顯示結果:

 

關於layer的Mask

 //可以定義layer
//    CALayer *layer = [CALayer layer];
//    layer.frame = CGRectMake(50, 50, 100, 200);
//    layer.backgroundColor = [UIColor greenColor].CGColor;
//    [self.view.layer insertSublayer:layer atIndex:0];
    
    //也可以定義imageView
    UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 100, 200)
    ];
    image.image = [UIImage imageNamed:@"app1.png"];
    [self.view addSubview:image];

    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 0, 100, 0);
    label.font = [UIFont systemFontOfSize:25];
    label.text = @"我是遮罩層";
    label.numberOfLines = 0;
    [label sizeToFit];
    //記住,如果用的是layer的mask,那麼遮罩層一定要ADD到父視圖中
    [self.view addSubview:label];
    
    image.layer.mask = label.layer;
    label.frame = image.layer.bounds;

顯示結果:

 

這個關於Mask(遮罩層)大致需要注意的就是這些了,

那麼說一說我爲什麼會用到這個屬性吧,因爲我這邊需要用到一個顏色漸變的Label,(額,網上別人也有,只是當時沒理解,現在自己做一遍的話,理解透徹點)

那麼這裏就需要用到一個漸變的類CAGradientLayer

 CAGradientLayer *layer = [[CAGradientLayer alloc]init];
    layer.frame = CGRectMake(50, 50, 100, 200);
    layer.colors = @[(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor,(id)[UIColor yellowColor].CGColor];
    layer.startPoint = CGPointMake(0, 1);
    layer.endPoint = CGPointMake(1,1);
    [self.view.layer insertSublayer:layer atIndex:0];
    
    //也可以定義imageView
//    UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 100, 200)
//    ];
//    image.image = [UIImage imageNamed:@"app1.png"];
//    [self.view addSubview:image];

    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 0, 100, 0);
    label.font = [UIFont systemFontOfSize:25];
    label.text = @"我是遮罩層我是遮罩層";
    label.numberOfLines = 0;
    [label sizeToFit];
    //記住,如果用的是layer的mask,那麼遮罩層一定要ADD到父視圖中
    [self.view addSubview:label];
    
    layer.mask = label.layer;
    label.frame = layer.bounds;

效果:

額 好了 到此結束了 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章