是的,是有...
如果要同時具有拐角半徑和陰影,你不打開- masksToBounds,而是設置圓角半徑,並用圓角矩形設置陰影的貝塞爾路徑。保持兩個相同的半徑:
[layer setShadowOffset:CGSizeMake(0, 3)];
[layer setShadowOpacity:0.4];
[layer setShadowRadius:3.0f];
[layer setShouldRasterize:YES];
[layer setCornerRadius:12.0f];
[layer setShadowPath:
[[UIBezierPath bezierPathWithRoundedRect:[self bounds]
cornerRadius:12.0f] CGPath]];
您可能希望在不一旦你設置陰影路徑設置-shouldRasterize參數來檢查你的表現。一旦你設置了陰影路徑,繪圖性能就會非常好。
UPDATE
我還沒有看這個問題很長一段時間,但現在看來,你不再需要設置一個shadowPath
爲了得到這個工作。只需設置cornerRadius
和shadowOpacity
即可使用。我認爲iOS5以後就是這樣(據我所知)。提供此更新可能是不必要的,因爲設置這些參數「正常」,但我將爲後人提供它。總括來說,這是現在所有你需要:
[layer setShadowOpacity:0.4];
[layer setCornerRadius:12.0f];
如果您仍需要更好的性能,你可以繼續設置shouldRasterize
參數,以及:
[layer setShouldRasterize:YES];
和性能來講,它的價值注意到如果你注意到呆滯的動畫,你會希望使用設置陰影路徑的技巧。此更新實際上只是指出,設置路徑不再需要達到同時顯示拐角半徑和陰影的效果。但是,如果性能是您的首要任務,請使用路徑。
- (void)viewDidLoad
{
[super viewDidLoad];
CALayer *layer = [CALayer layer];
[layer setBounds:CGRectMake(0.0f, 0.0f, 100.0f, 200.0f)];
[layer setPosition:[[self view] center]];
[layer setBackgroundColor:[[UIColor lightGrayColor] CGColor]];
[layer setShadowOpacity:0.55f];
[layer setCornerRadius:8.0f];
[layer setBorderWidth:1.0f];
[[[self view] layer] addSublayer:layer];
[[[self testView] layer] setShadowOpacity:0.55f];
[[[self testView] layer] setShadowRadius:15.0f];
[[[self testView] layer] setCornerRadius:8.0f];
[[[self testView] layer] setBorderWidth:1.0f];
}
:
更新2
由於人們似乎遇到了麻煩這在某些情況下工作,我在這裏從我創建了一個樣本項目後更完整的代碼片段
testView
是我在界面生成器中添加的一個UIView,並設置了一個插座。這是爲了確保它在明確添加的兩個圖層以及子視圖中的圖層上都一樣。
我已經在iOS5到iOS6.1的模擬器上測試了這個。它給出了這樣的結果,我在他們每個人:
有什麼理由不shouldRasterize設置爲YES? – memmons 2010-11-09 02:50:53
這取決於你更新圖層的頻率。如果您打算將其設置一次,而不是再次更新,則柵格化它會有助於提升性能,前提是您正在爲圖層製作動畫。但是,如果圖層的內容經常更新,每次內容更改時都會將該內容呈現爲圖像,這實際上會損害您的滾動性能(假設您正在滾動/製作動畫)。 – 2010-11-09 04:44:29
需要UIBezierPath和bezierPathWithRoundedRect之間的空格。 – 2011-01-29 03:13:36