2012-07-02 5 views
7

マウスドラッグ中にカーソルを置くことができないのはなぜですか?ドラッグを開始するとすぐに、「矢印」に戻ります(ただし、起動後にアプリデリゲートで公開ハンドとして設定しています)。NSCursorは常に矢印にリセットされます

- (void)mouseDown:(NSEvent *)event 
{ 
    [[NSCursor closedHandCursor] push]; 
} 

- (void)mouseUp:(NSEvent *)event 
{ 
    [NSCursor pop]; 
} 

答えて

10

addCursorRect:cursor:を使用して、表示するカーソルを設定してみてください。

あなたのビューの resetCursorRectsをオーバーライド

[self.window invalidateCursorRectsForView:self]; 

しかし、あなたはあなたの外で別のカーソルを持っているしたい場合は、あなたを見る:あなたのカーソルrectsを更新強制的にinvalidateCursorRectsForView:を呼び出す必要が

- (void)resetCursorRects 
{ 
    [super resetCursorRects]; 
    if(drag) { 
     [self addCursorRect:self.bounds cursor:[NSCursor closedHandCursor]]; 
    } 
} 

mouseDragged:メソッドで[[NSCursor closedHandCursor] set]に電話することができます。

+0

ああ!私はこのようなものを見ましたが、私が追加したいものに対して*リセット*を無効にするのは馬鹿に思えました。私は今、ビューの位置を変更するとカーソルrectが無効になることを理解しています!ありがとう。 – borrrden

+2

addCursorRectの引数は '[self bounds]'であり、 '[self frame]'ではありません。 – alecail

14

あなたは-mouseDownで行うことができますドラッグ中に他のビューは、あなたのカーソルを変更したくない場合は、次の

[[self window] disableCursorRects]; 

と-mouseUpに:

[[self window] enableCursorRects]; 
[[self window] resetCursorRects]; 
+3

これを行う場合は、mouseUpが実際にトリガーされることを確認してください。 NSTableViewや他のタイプのビューでも、mouseDownでbaseを呼び出すと、mouseUpはそれ以上トリガされません。その理由は、基になるメカニズムがイベントを盗み出して消費するためです。入力/終了されたマウスでこれを使用することも良い解決策かもしれません –