UIView的陰影設(shè)置主要通過UIView的layer
的相關(guān)屬性來設(shè)置
- 陰影的顏色
imgView.layer.shadowColor = [UIColor blackColor].CGColor;
- 陰影的透明度
imgView.layer.shadowOpacity = 0.8f;
- 陰影的圓角
imgView.layer.shadowRadius = 4.f;
- 陰影偏移量
imgView.layer.shadowOffset = CGSizeMake(4,4);
效果
imgView.layer.shadowOffset = CGSizeMake(0,0);
效果
其實從偏移量上可以看出來,即使偏移量為(0,0)時,圍繞view的四周依然能看到一定陰影。
這里還要說明一點的是,當(dāng)我們不設(shè)置陰影的偏移量的時候,默認(rèn)值為(0,-3),既陰影有3個點的向上偏移量。為什么是向上偏移呢?這好像有點不合常理,其實這是由‘歷史原因’造成的,陰影最先是在MacOS平臺上出現(xiàn)的,默認(rèn)是向下偏移3個點,我們知道MacOS的坐標(biāo)系統(tǒng)和iOS坐標(biāo)系統(tǒng)y軸方向是相反的,所以在iOS系統(tǒng)中由于y軸方向的改變就變成了默認(rèn)向上偏移3個點。
-
陰影的路徑
除了通過上面的操作,我們還可以設(shè)定陰影的路徑
//路徑陰影
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(-5, -5)];
//添加直線
[path addLineToPoint:CGPointMake(paintingWidth /2, -15)];
[path addLineToPoint:CGPointMake(paintingWidth +5, -5)];
[path addLineToPoint:CGPointMake(paintingWidth +15, paintingHeight /2)];
[path addLineToPoint:CGPointMake(paintingWidth +5, paintingHeight +5)];
[path addLineToPoint:CGPointMake(paintingWidth /2, paintingHeight +15)];
[path addLineToPoint:CGPointMake(-5, paintingHeight +5)];
[path addLineToPoint:CGPointMake(-15, paintingHeight /2)];
[path addLineToPoint:CGPointMake(-5, -5)];
//設(shè)置陰影路徑
imgView.layer.shadowPath = path.CGPath;
效果
有關(guān)UIBezierPath的知識請看:UIBezierPath介紹
-
陰影輪廓和陰影剪切問題
我們知道CALayer是可以設(shè)置邊框的,而且邊框的輪廓是不受子圖層影響的,就像下圖這個樣子:
但是陰影則和邊框有所不同,陰影的輪廓是包含了當(dāng)前圖層的所有子圖層的輪廓,如圖:
仔細(xì)觀察可以看出陰影的輪廓包含了當(dāng)前圖層和子圖層共同組成的范圍。當(dāng)然此時masksTobounds的值為NO,如果設(shè)置成YES,不單會剪切掉超出當(dāng)前圖層的子圖層的部分,也會將陰影也剪切到,變成完全看不出陰影的狀態(tài)。
那如果我們既想剪裁又想實現(xiàn)陰影效果,可能就得通過兩個圖層來實現(xiàn)了:一個只畫陰影的空的外圖層,和一個用masksToBounds剪裁內(nèi)容的內(nèi)圖層,這兩個圖層相同位置大小。
版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 ,轉(zhuǎn)載時必須注明出處及相應(yīng)鏈接!