//@mg:masksToBounds必須為NO否者陰影沒有效果 // cell.layer.masksToBounds = NO; cell.layer.contentsScale = [UIScreen mainScreen].scale; cell.layer.shadowOpacity = 0.75f; cell.layer.shadowRadius = 4.0f; cell.layer.shadowOffset = CGSizeMake(0,0); cell.layer.shadowPath = [UIBezierPath bezierPathWithRect:cell.bounds].CGPath; //設置緩存 cell.layer.shouldRasterize = YES; //設置抗鋸齒邊緣 cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
CALayer有一個叫做conrnerRadius
的屬性控制着圖層角的曲率。它是一個浮點數,默認為0(為0的時候就是直角),但是你可以把它設置成任意值。默認情況下,這個曲率值只影響背景顏色而不影響背景圖片或是子圖層。不過,如果把masksToBounds
設置成YES的話,圖層里面的所有東西都會被截取。
給shadowOpacity
屬性一個大於默認值(也就是0)的值,陰影就可以顯示在任意圖層之下。shadowOpacity
是一個必須在0.0(不可見)和1.0(完全不透明)之間的浮點數。如果設置為1.0,將會顯示一個有輕微模糊的黑色陰影稍微在圖層之上。若要改動陰影的表現,你可以使用CALayer的另外三個屬性:shadowColor
,shadowOffset
和shadowRadius
。
shadowOffset
屬性控制着陰影的方向和距離。它是一個CGSize
的值,寬度控制這陰影橫向的位移,高度控制着縱向的位移。shadowOffset
的默認值是 {0, -3},意即陰影相對於Y軸有3個點的向上位移。
蘋果更傾向於用戶界面的陰影應該是垂直向下的,所以在iOS把陰影寬度設為0,然后高度設為一個正值不失為一個做法。
shadowRadius
屬性控制着陰影的模糊度,當它的值是0的時候,陰影就和視圖一樣有一個非常確定的邊界線。當值越來越大的時候,邊界線看上去就會越來越模糊和自然。蘋果自家的應用設計更偏向於自然的陰影,所以一個非零值再合適不過了。
當陰影和裁剪扯上關系的時候就有一個頭疼的限制:陰影通常就是在Layer的邊界之外,如果你開啟了masksToBounds
屬性,所有從圖層中突出來的內容都會被才剪掉。
從技術角度來說,這個結果是可以是可以理解的,但確實又不是我們想要的效果。如果你想沿着內容裁切,你需要用到兩個圖層:一個只畫陰影的空的外圖層,和一個用masksToBounds
裁剪內容的內圖層。