2012-07-02 8 views
7

Perché non riesco a mantenere il cursore premuto per tutta la durata del trascinamento del mouse? Non appena inizio il trascinamento, ritorna a "Freccia" (anche se l'ho impostato come mano aperta nel delegato dell'app dopo il lancio).NSCursor si reimposta sempre su Arrow

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

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

risposta

10

Provare a utilizzare il addCursorRect:cursor: per impostare il cursore per la visualizzazione.

sovrascrivere il resetCursorRects per la visualizzazione:

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

È necessario chiamare invalidateCursorRectsForView: per forza aggiornare i rettangoli cursore:

[self.window invalidateCursorRectsForView:self]; 

Ma se si vuole avere il cursore diversa al di fuori di voi si visualizza possibile chiamare [[NSCursor closedHandCursor] set] nel proprio metodo mouseDragged:.

+0

Oh! Ho visto qualcosa del genere ma sembrava sciocco scavalcare * reset * per qualcosa che volevo * aggiungere *. Capisco ora che il cursore rect viene invalidato quando cambio ora la posizione della vista! Grazie. – borrrden

+2

L'argomento per aggiungereCursorRect è '[self bounds]', non '[self frame]'. – alecail

14

Se non si desidera altre viste per cambiare il cursore mentre si trascina si può fare in -mouseDown:

[[self window] disableCursorRects]; 

e in -mouseUp:

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

se lo fai, assicurati che mouseUp venga attivato per davvero. Anche in NSTableView e in altri tipi di visualizzazioni, se si chiama base in mouseDown, mouseUp non viene più attivato, perché il meccanismo sottostante ruba e "consuma" l'evento. Anche l'utilizzo di questo mouse nel modo di entrare/uscire potrebbe essere una buona soluzione –