2016-11-04 8 views
5

私は、ユーザのマウスカーソルを追跡する情報NSPopoverを表示したいと思います。このためNSPopoverをマウスポインタに正しく追従させ、マウスイベントを無視するにはどうすればいいですか?

、私はポップオーバーのpositioningRectたびmouseMovedイベント火災を更新するNSTrackingAreaを使用しています。

  1. ポップオーバーが若干遅れて、マウスを次の

    しかしながら、これは2つの欠点を有しています。この遅延を減らして、ポップオーバーをマウスポインタに「糊付け」して表示させるにはどうすればよいですか?そのようにトラッキングエリアのmouseMovedイベントもはや火災、マウス移動イベントを「吸収」するポップオーバーが発生し、私はポップオーバーの方向にマウスポインタを移動すると、トラッキングエリアのmouseExitedメソッドが呼び出されます

  2. 、。ポップオーバーがマウスイベントを吸収するのを避けるにはどうすればよいですか、あるいは少なくともこれらのイベントを転送し続けますか?

この質問は、私がNSPopoverを使用しています区別して、Any way around this NSTrackingArea quirk?と非常によく似ているので、私は上のignoresMouseEventsを設定することは何もありません。

答えて

2

私はあなたの問題を見ました。私は遅れを解消することができませんでしたが、popover.animatesfalseに設定すると、それが減少する可能性があります。

間違ったアプローチ

は、私はもう一つの上に新しい境界線(と影)windowを追加することにより、mouseExitedpopover以上の問題を解決することができました。 trackingAreaが透過ウィンドウに追加され、元のウィンドウにポップオーバーされます。透明なウィンドウlevelに応じて、それはポップオーバーの上にあるため、互いに干渉することはありません。あなたは私のテストの結果を見ることができます下のGIFでは :

マウストラッキング:

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から継承されていますが、オブジェクトを保持するcontentViewControllerオブジェクトがあります。これはポップオーバーwindowを保持します。 (hereで説明したように)

popoverが示された後そう単に

popover.contentViewController?.view.window?.ignoresMouseEvents = true 

を設定します。

+0

私は既に 'popover 'を使っていました。// popoverの原点を 'popover.contentViewController?.view.window?.setFrameOrigin()'経由で直接試してみましたが、それも役に立たなかったので、私は推測しますそこには解決策がありません。 'ignoresMouseEvents = true'はうまく動作しますが、ありがとう! – MrMage

+0

@MrMageあなたは私が推測するmangerlahnに賞金を授与する必要があります:) – manniL

関連する問題