0

私はそれに2つのビューを持つウィンドウを持っています:

ウィンドウのほとんどは PRH ムービー ビューで占められていますが、ウィンドウの下部 20 ポイントは PRH コントローラー ビューに属しています。

ムービー ビューとコントローラー ビューの両方が、さまざまな目的でmouseDown:mouseUp:をオーバーライドします (ムービー ビューにはターゲットとアクションがあり、ボタンとして反応しますが、コントローラーはドラッグのシークとサポートをサポートします)。

ひねりを加えたのは、ムービー ビュー内をクリックすると (スクリーンショットに示されているように、一般に、ムービー ビューを見逃すのに十分な大きさであり、代わりにコントローラー ビューにヒットする可能性が非常に低くなります)、mouseDown:およびmouseUp:メッセージがコントローラー ビューに送信されることです! ムービー ビューはどちらのメッセージも受け取りません。

ムービー ビューまたはその親ビュー (プレーンな NSView) ではオーバーライドせずhitTest:、コントローラー ビューでのみオーバーライドしました (そのビューにあるトラッキング エリアに関係する理由で、私の実装は単純に を返しますself。これは、コントローラー ビュー)。

それで、何が得られますか?

4

1 に答える 1

0

おそらくご想像のとおり、これはコントローラー ビューでの私のhitTest:実装でした。

hitTest:は、マウスの位置がフレーム内にあるビューに送信されるだけではないことがわかります。ウィンドウ内のすべてのビューに送信されます。クリックの両端でマウスの近くになかったビューも含まれます。

したがって、 をオーバーライドhitTest:するときは、ポイントが実際に自分の中にあることを確認してください。最も簡単な方法は[super hitTest:thePoint]、結果がnil. (ウィンドウ内の他のビューからクリックを奪いたくない場合を除きます。)

于 2013-02-21T06:41:14.420 に答える