2016-07-24 73 views
1

我需要一個影子在我的視圖上。我嘗試使用視圖的NSShadow功能,但在滾動視圖中使用速度太慢。我想嘗試使用圖層的陰影屬性來希望提高性能。macOS:CALayer影子不顯示

在我NSView.updateLayer()的方法,我設置以下屬性:

layer.shadowOffset = CGSize(width: 0, height: -3) 
layer.shadowRadius = 3 
layer.shadowColor = NSColor.black().cgColor 
layer.shadowOpacity = 0.3 

沒有陰影所示。我也試過設置NSView.wantsDefaultClippingCALayer.masksToBoundsfalse,但是仍然沒有影子。

爲什麼在使用CALayer陰影屬性時沒有陰影?

回答

0

我看着CALayer.render(in:)的反彙編,它看起來像是正確訪問圖層陰影屬性。因此NSView可能會在每個繪製週期中用自己的屬性覆蓋圖層陰影屬性。底線是,您只能通過在視圖上使用shadow屬性爲觀看背景圖層添加陰影。

雖然我確實解決了我的滾動性能問題。我在滾動期間對我的應用程序進行了剖析,並注意到在CGContextEndTransparencyLayer中創建陰影圖像導致CPU飆升。

創建陰影有兩個步驟。首先,必須根據上述像素的Alpha通道計算陰影路徑。其次,應用高斯模糊來柔化陰影的邊緣。

因爲我知道陰影頂部的視圖是完全不透明的,我知道路徑將只是視圖的邊界。我可以通過設置圖層的shadowPath屬性跳過第一步。但不幸的是,圖層的陰影屬性被沒有shadowPath屬性的視圖覆蓋。

我的解決方案是創建一個容器視圖,在內容視圖下繪製矩形陰影圖像。這個陰影圖像只創建一次並緩存,顯着提高了滾動性能。並且,由於Auto Layout的功能(特別是對齊矩形插槽),可以使用容器視圖而無需手動調整陰影。您可以查看我的代碼on GitHub

1

您需要添加的是:

self.view.wantsLayer = true 

我試圖運行下面的代碼;該層確實顯示以及影子:

let layer = CALayer() 
layer.frame = CGRect(x: 50, y: 50, width: 100, height: 100) 

layer.backgroundColor = NSColor.redColor().CGColor 

layer.shadowOffset = CGSize(width: 0, height: -3) 
layer.shadowRadius = 3 
layer.shadowColor = NSColor.blackColor().CGColor 
layer.shadowOpacity = 1.0 //Or: 0.3 as you originally have 
self.view.wantsLayer = true 
self.view.layer?.addSublayer(layer) 

順便說一句,你有以下行一個錯字:

NSColor.black().cgColor 

,因爲它應該是:

NSColor.blackColor().CGColor 
+0

謝謝!但我正在專門討論觀看圖層,而不是獨立圖層。另外,'.cgColor'在Swift 3中不是一個錯字。:-) – fumoboy007