your programing

레이어 지원 NSView 회전 및 왜곡 된 형제

lovepro 2020. 12. 31. 23:08
반응형

레이어 지원 NSView 회전 및 왜곡 된 형제


레이어 지원 NSView에 이상한 문제가 있으며 형제입니다. 회전 된 수퍼 뷰에 연결된 기존 뷰 계층에 추가 될 때 일부가 올바르게 렌더링되지 않습니다. 아래는 세부 사항입니다.

문제

- NSScrollView (layer can be here)
  - NSClipView (or here)
    - Document View (or even here)
      - Some *rotated* subview
        - { Problematic sublings }

따라서 계층 자체는 다소 단순하고 일반적입니다. 일부 문서가있는 스크롤보기, 문서 하위보기는 일부 콘텐츠를 나타냅니다. 제 경우에는 그래픽 콘텐츠이고 회전 할 수 있습니다. 회전 된 뷰는 몇 가지 추가 하위 뷰 (다양한 마커, 제어점 등)를 가질 수 있으며 백엔드에 CALayer를 사용하면 왜곡 된 그래픽과 관련된 이상한 문제에 직면합니다.문제 그림

카메라 사진은 별도로 렌더링 되며이 뷰 트리의 일부가 아닙니다. 마커와 버튼에주의하세요.

이미지에서 볼 수 있듯이 하위보기 (임의 버튼 만 있음)가있는 테스트보기가 있습니다. 오른쪽의 개체는 항상 올바르게 렌더링됩니다. 내 테스트에 따르면 frameRotation 이있는 모든 NSView는 정상적으로[0, pi/2] 렌더링됩니다. 왼쪽의 개체가 흐릿하게 렌더링됩니다.이 항목에 대한 캐싱 버퍼가 너무 작은 것 같습니다. frameRotation[pi/2, pi]범위 내에 있을 때 발생 합니다.

가장 이상한 것

이 문제는 "실시간 회전"에서는 발생하지 않습니다. , 설정 계층 구조 frameRoation변경하면 각 하위 뷰가 제자리에 있으면 모든 것이 잘 작동합니다. 그러나 이미 회전 된 오브젝트에 서브 링이 추가되면 버그가 발생하고이 흐릿한 모양이 나타납니다.

내 응용 프로그램에서 사용자가 항목을 클릭하면 형제가 superview에 추가되는 순간 특수 하위보기가 나타납니다.

백엔드 레이어에는 하위 뷰에 대한 캐싱 버퍼가 있으며 루트 뷰가 회전 할 때 일부는 잘못된 크기로 계산됩니다.

구현 방법 및 시도한 내용

  1. 보기는 매우 간단하고 표준 [view setWantsLayer:YES]적이며 계층 구조의 루트보기 (스크롤보기, 클립보기, 문서보기) 로 푸시하려고했습니다 . 각각의 결과는 동일했습니다. 손으로 만든 레이어 나 레이어 호스트가 없습니다.
  2. 콘텐츠보기, 형제 및 실제로 전체보기 트리 (위에서 언급 한보기 제외)에는 레이어가 없습니다. 그래도 성공하지 못한 채 다양한 아이템에 레이어를 켜 보았습니다.
  3. 운이없는 백엔드 레이어를 강제로 업데이트 (setNeedsDisplay)하려고했습니다.
  4. 레이어를 완전히 재설정하는 것은 작동하는 것처럼 보이지만 어렵습니다.

해결책?

사실 그게 질문입니다. 누구든지 그러한 문제에 직면 했습니까? 누군가가 레이어가 모든 캐시를 삭제하고 완전히 갱신하도록 강제하는 방법을 알고 있습니까? 지금까지 두 가지 해결책 만 있습니다. 레이어를 완전히 삭제하거나 (작동하지만 모든 시선을 끄는) 레이어 호출을 재설정 한 setWantsLayer:NO다음 setWantsLayer:YES. 이것은 끔찍한 성능을 가지고 있습니다.


"setNeedsDisplay"를 시도했다고 작성했습니다. 메인 스레드에서이 메서드를 호출하고 있습니까? 내 응용 프로그램 중 하나에서 다른 스레드에서 setNeedsDisplay를 호출해도 아무 일도 일어나지 않았습니다. 디스플레이가 유효하지 않은지 확인하려면 다음과 같이 dispatch를 사용하십시오.

dispatch_async(dispatch_get_main_queue(), ^{

       [view setNeedsDisplay:YES];
});

또한 IB 검사관을 살펴보십시오. 때때로 레이어 기반 뷰는 레이어 기반이 아닌 뷰와 혼합되는 것을 좋아하지 않습니다. "View Effects Inspector"레이어에서 루트 레이어의 모든 하위보기에 대한 지원이 켜져 있는지 확인합니다.

(내 프로그램에서 레이어 지원이 꺼지면 때때로 NSButton이 사라집니다)

참조 URL : https://stackoverflow.com/questions/14957047/layer-backed-nsview-rotation-and-skewed-siblings

반응형