2016-07-24 9 views
1

私の視野には影が必要です。ビューのNSShadow機能を使用しようとしましたが、スクロールビューで使用するのが遅すぎます。レイヤのシャドウプロパティを使用して、パフォーマンスを改善したいと考えています。私NSView.updateLayer()方法でmacOS:CALayerの影が表示されない

、私は次のプロパティを設定します。

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

ませ影が表示されません。 NSView.wantsDefaultClippingCALayer.masksToBoundsfalseに設定しようとしましたが、まだ影がありません。

CALayerシャドウプロパティを使用しているときにシャドウが表示されないのはなぜですか?あなたが追加する必要がどのような

答えて

0

I CALayer.render(in:)の分解を見て、レイヤーのシャドウプロパティに正しくアクセスしているように見えました。したがって、NSViewはおそらく、描画サイクルごとに独自のレイヤーシャドウプロパティを上書きします。要点は、ビューのshadowプロパティを使用して、ビューバッキングレイヤーにのみ影を追加できることです。

私はスクロールパフォーマンスの問題を解決しました。私はスクロール中に私のアプリケーションをプロファイリングし、CGContextEndTransparencyLayerの影の画像の作成がCPUのスパイクを引き起こしていることに気づいた。

シャドウを作成するには2つの手順があります。第1に、影のための経路は、上記ピクセルのアルファチャンネルに基づいて計算されなければならない。第2に、影のエッジを柔らかくするために、ガウスのぼかしが適用されます。

私は影の上のビューが完全に不透明であることを知っているので、パスは単にビューの境界になることがわかります。レイヤーのshadowPathプロパティを設定することで、最初のステップをスキップできました。しかし残念なことに、レイヤのシャドウプロパティは、shadowPathプロパティを持たないビューによって上書きされます。

私のソリューションは、コンテンツビューの下に長方形の影の画像を描画するコンテナビューを作成することでした。このシャドーイメージは一度作成されキャッシュされ、スクロールパフォーマンスが大幅に向上します。また、自動レイアウトの機能(具体的には、整列矩形のインセット)のおかげで、シャドウを手動で調整することなく、コンテナビューを使用することができます。

私のコードon GitHubを見ることができます。

1

は次のとおりです。

self.view.wantsLayer = true 

私は、次のコードを実行してみました。層は、同様に影を示してい:それがあるべきよう

NSColor.black().cgColor 

::ところで

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.blackColor().CGColor 
+0

ありがとうございます!しかし私は、スタンドアロン層ではなく、ビューバック層について具体的に話していました。また、 '.cgColor'はSwift 3のtypoではありません:-) – fumoboy007

関連する問題