上一篇章講到出現死角的情況,該怎麼解決
我們可以看到這個屬性:
/* 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;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zMwkDM1gDNyETMwEDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這麼炫酷,我們如果這樣設定,就會知道其中的原理了:
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];
效果:
原來便宜度和透明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