2016-07-24 6 views
1

내 시야에 그림자가 필요합니다. 보기의 NSShadow 기능을 사용해 보았지만 스크롤보기에서 사용하기에는 너무 느립니다. 레이어의 그림자 속성을 사용하여 성능을 향상 시키려합니다. 어떤 그림자가 표시되지 않습니다macOS : CALayer 그림자가 보이지 않습니다.

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

: 내 NSView.updateLayer() 방법에서

, 나는 다음과 같은 속성을 설정합니다. NSView.wantsDefaultClippingCALayer.masksToBoundsfalse으로 설정하려고했지만 여전히 그림자가 없습니다.

CALayer 그림자 속성을 사용할 때 그림자가없는 이유는 무엇입니까?

답변

0

I을 CALayer.render(in:)의 해체를 살펴본 결과 레이어 그림자 속성에 제대로 액세스하고있는 것으로 보입니다. 따라서 NSView은 모든 그리기주기마다 고유 한 레이어 그림자 속성을 덮어 씁니다. 결론은 뷰의 shadow 속성을 사용하여 뷰 백업 레이어에만 그림자를 추가 할 수 있다는 것입니다.

비록 스크롤 성능 문제를 해결했습니다. 스크롤하는 동안 내 응용 프로그램을 프로파일 링하고 CGContextEndTransparencyLayer에 그림자 이미지를 작성하면 CPU가 스파이크를 일으키는 것으로 나타났습니다.

그림자를 만드는 데는 두 단계가 있습니다. 먼저 그림자의 경로는 위의 픽셀의 알파 채널을 기반으로 계산되어야합니다. 둘째, 그림자의 가장자리를 부드럽게하기 위해 가우스 흐림이 적용됩니다.

그림자 상단의 뷰가 완전히 불투명하다는 것을 알고 있기 때문에 경로가 뷰의 경계가 될 것입니다. 레이어의 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의 오타가 아닙니다 :-) – fumoboy007

관련 문제