2012-07-02 26 views
7

Warum kann ich den Cursor nicht für die Dauer meines Mausziehens gedrückt halten? Sobald ich anfange zu ziehen, wird "Arrow" angezeigt (obwohl ich es nach dem Start im App-Delegierten als offene Hand eingestellt habe).NSCursor wird immer auf Pfeil zurückgesetzt

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

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

Antwort

10

Verwenden Sie die addCursorRect:cursor:, um den Cursor für Ihre Ansicht zu setzen.

die resetCursorRects für Ihre Ansicht außer Kraft setzen:

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

Sie müssen invalidateCursorRectsForView: rufen aktualisieren Rects Sie den Cursor zu erzwingen:

[self.window invalidateCursorRectsForView:self]; 

Aber wenn Sie verschiedene Cursor haben außerhalb von Ihnen Sie sehen kann [[NSCursor closedHandCursor] set] in Ihrer mouseDragged: Methode anrufen.

+0

Oh! Ich sah etwas in der Art, aber es schien albern, * reset * für etwas, das ich hinzufügen * hinzufügen wollte. Ich verstehe jetzt, dass der Cursor rect ungültig wird, wenn ich jetzt die Position der Ansicht ändere! Vielen Dank. – borrrden

+2

Das Argument zum Hinzufügen von CursorRect ist '[self bounds]', nicht '[self frame]'. – alecail

14

Wenn Sie nicht andere Ansichten möchten Sie den Cursor ändern, beim Ziehen Sie in -mouseDown tun können:

[[self window] disableCursorRects]; 

und in -mouseUp:

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

Wenn Sie dafür gehen, stellen Sie sicher, dass mouseUp für echt ausgelöst wird. Wenn Sie in NSTableView und anderen Sichten auch Base in mouseDown aufrufen, wird mouseUp nicht mehr ausgelöst, weil der zugrunde liegende Mechanismus das Ereignis stiehlt und "konsumiert". Dies könnte auch eine gute Lösung sein –