2016-11-04 17 views
5

사용자의 마우스 커서를 추적하는 정보 NSPopover을 표시하고자합니다.NSPopover를 올바르게 마우스 포인터를 따라 이동시키고 마우스 이벤트를 무시하는 방법?

이 경우 mouseMoved 이벤트가 발생할 때마다 NSTrackingArea을 사용하여 팝업의 positioningRect을 업데이트합니다.

  1. 팝 오버가 약간의 지연이와 마우스를 다음과

    그러나,이 두 가지 단점이있다. Popover가 마우스 포인터에 "더 붙은"것처럼 보이게하려면이 지연을 어떻게 줄일 수 있습니까?

  2. 팝업 포인터 방향으로 마우스 포인터를 이동하면 추적 영역의 mouseExited 메서드가 호출되어 popover가 마우스 이동 이벤트를 "흡수"하여 추적 영역의 mouseMoved 이벤트가 더 이상 발생하지 않게됩니다. popover가 마우스 이벤트를 흡수하지 못하도록하려면 어떻게해야합니까?

이 질문은 내가 NSPopover을 사용하고있는 구별로, Any way around this NSTrackingArea quirk? 매우 유사합니다, 그래서에 ignoresMouseEvents를 설정하는 게 없다.

답변

2

나는 귀하의 문제를 살펴 보았습니다. 지연을 없앨 수는 없지만 popover.animatesfalse으로 설정하면 줄일 수 있습니다.

잘못된 접근 방식 :

나는 다른 하나의 위에 새로운 경계 (그리고 그림자가) window을 추가하여 mouseExitedpopover를 통해 문제를 해결할 수 있었다. trackingArea은 투명한 창에 추가되고 원래 창으로 팝 오버됩니다. 투명 창이있는 level에 따라 팝업 위에 있으므로 서로를 간섭 할 수 없습니다. 지프에서 내 테스트의 결과를 볼 수 아래 :

마우스 추적 :

override func mouseMoved(with event: NSEvent) { 
    let location = self.view.convert(event.locationInWindow, from: nil) 
    popover.positioningRect.origin.x = location.x 
    popover.positioningRect.origin.y = location.y 
} 

사용자 정의 창

여기 example gif

내 코드의 일부입니다

transparentWindow.backgroundColor = NSColor.clear 
transparentWindow.isOpaque = false 
transparentWindow.styleMask = .borderless 
transparentWindow.makeKeyAndOrderFront(nil) 

업데이트 11/11/2016 :

방금 ​​제공 한 링크의 질문을 읽었습니다. ignoresMouseEvents을 설정하는 창이 있습니다. NSPopoverNSObject에서 상속 되더라도 contentViewControllerview 개체를 보유하고 있으며,이 개체는 팝업 메시지 window을 보유합니다.

그래서 간단히 도시되어 popover
popover.contentViewController?.view.window?.ignoresMouseEvents = true 

세트 (AS는 here 설명).

+0

이미'popover '를 사용하고있었습니다.animates = false'이지만 지연은 여전히 ​​눈에니다. -/popover의 원본을'popover.contentViewController? .view.window? .setFrameOrigin()'을 통해 직접 시도했지만 그 역시 도움이되지 않았습니다. 거기에 해결책이 없습니다. 'ignoresMouseEvents = true'는 잘 작동하지만, 고마워! – MrMage

+0

@MrMage 당신이 상상하는 mangerlahn에게 현상금을 수여해야합니다 :) – manniL