天天看點

CALayer - 2

上一篇章講到出現死角的情況,該怎麼解決

我們可以看到這個屬性:

/* When true an implicit mask matching the layer bounds is applied to
 * the layer (including the effects of the `cornerRadius' property). If
 * both `mask' and `masksToBounds' are non-nil the two masks are
 * multiplied to get the actual mask values. Defaults to NO.
 * Animatable. */

@property BOOL masksToBounds;           

解釋得非常清楚,會确切地适配到層的bounds并且應用到圖層上,包括cornerRadius屬性的變化。其實說白了就是把超出主圖層的部分裁減掉。

添加一句代碼即可:

self.vview.layer.masksToBounds = YES;
           

我們同時可以看到另外一個和這個屬性可能有點關系的屬性:

@property(nullable, strong) CALayer *mask;           

這個就是CALayer的遮罩屬性,我們會在以後在進行學習,這個可以實作很多CALayer有趣的動畫或者是效果的哦

那有沒有别的解決方法呢,實際中當然很多,例如圖檔是背景為透明的底圖,還能用這個方法将内容縮小顯示:

subLayer.frame = CGRectInset(self.bounds, 12, 12);
           

我們繼續來看看圖層的陰影:

//設定陰影
    self.vview.layer.shadowColor = [UIColor blackColor].CGColor;
    self.vview.layer.shadowOffset = CGSizeMake(15, 5);
    self.vview.layer.shadowOpacity = 0.6;           
CALayer - 2

這麼炫酷,我們如果這樣設定,就會知道其中的原理了:

UIView* vvview = [[UIView alloc] init];
    [vvview setFrame:CGRectMake(50, 50, 150, 150)];
    
    vvview.layer.borderColor = [UIColor blackColor].CGColor;
    vvview.layer.borderWidth = 1;
    
    //設定陰影
    vvview.layer.shadowColor = [UIColor blackColor].CGColor;
    vvview.layer.shadowOffset = CGSizeMake(15, 5);
    vvview.layer.shadowOpacity = 0.6;
    
    [self.view addSubview:vvview];           

效果:

CALayer - 2

原來便宜度和透明Rect是這樣來實作的,但是如果将視圖的顔色和邊框等設定成透明色clearColor,你會發現,陰影也随着消失了,是以要保證視圖是有顯示内容的

那如果我們同時要設定圖檔和圓角,使用了MaskToBounds裁減的方法後呢?會發現超出bounds的部分全部被裁減了,即陰影部分效果消失了。

該怎麼解決? 百度一下很多解決方法,最常用的就是寫一個有陰影的底層視圖,然後将設定好的圓角視圖添加上去,即将這兩者分離即可。

UIView* vvview = [[UIView alloc] init];
    [vvview setFrame:CGRectMake(50, 50, 150, 150)];

    
    //設定陰影
    vvview.layer.shadowColor = [UIColor blackColor].CGColor;
    vvview.layer.shadowOffset = CGSizeMake(15, 5);
    vvview.layer.shadowOpacity = 0.6;
    
    [self.view addSubview:vvview];
    
    //帶陰影的底層添加上圓角圖形
    [vvview addSubview:self.vview];           

注意應該是有陰影的添加圓角,如果圓角添加有陰影的随時又被裁減掉啦!

參考:

http://blog.sina.com.cn/s/blog_a573f7990102ux0j.html

http://stackoverflow.com/questions/26060392/setting-calayer-masktobounds-causing-layer-to-disappear