2012-08-23 2 views
0

Comment puis-je mettre à jour NSCursor chaque fois que j'en ai besoin? J'ai implémenté la méthode resetCursorRects. Dans resetCursorRects je crée une image avec la taille nécessaire (la taille dépend de la valeur du curseur dans mon application) et faire le curseur avec cette image. Donc, si mon curseur, qui indique la taille du curseur nécessaire, est en cours de modification, j'ai besoin que mon curseur soit mis à jour. Donc, si vous pensez logiquement, appeler [self resetCursorRects] devrait fonctionner, mais ce n'est pas le cas. Après avoir changé la valeur du curseur et par exemple la fenêtre de redimensionnement, le curseur se met à jour. Mais pourquoi ça ne se met pas à jour quand j'essaye de l'appeler?Mise à jour de NSCursor

Répondre

1

A cet effet, vous devez mettre en œuvre

@property (nonatomic, retain) NSArray *cursors; 

dans votre fichier .h et quelque chose comme:

- (void)loadCursors 
{ 
    NSCursor *defaultCursor = [[NSCursor alloc] initWithImage:[NSImage imageNamed:DEFAULT_CURSOR] hotSpot:NSMakePoint(2, 0)]; 
    NSAssert(defaultCursor, @"defaultCursor failed to load"); 
    NSCursor *clickedCursor = [[NSCursor alloc] initWithImage:[NSImage imageNamed:CLICKED_CURSOR] hotSpot:NSMakePoint(2, 0)]; 
    NSAssert(clickedCursor, @"clickedCursor failed to load"); 
    NSCursor *draggingCursor = [[NSCursor alloc] initWithImage:[NSImage imageNamed:DRAGGING_CURSOR] hotSpot:NSMakePoint(17, 2)]; 
    NSAssert(draggingCursor, @"draggingCursor failed to load"); 

    self.cursors = [NSArray arrayWithObjects:defaultCursor, clickedCursor, draggingCursor, nil]; 

    [defaultCursor release]; 
    [clickedCursor release]; 
    [draggingCursor release]; 

    [self resetCursorRects]; 
} 

- (void)setCursor:(NSUInteger)cursorIndex 
{ 
    [self discardCursorRects]; 

    [self addCursorRect:self.bounds cursor:[self.cursors objectAtIndex:cursorIndex]]; 
    [(NSCursor *)([self.cursors objectAtIndex:cursorIndex]) set]; 
} 

- (void)resetCursorRects 
{ 
    [self setCursor:CursorTypeDefault]; 
} 

et utiliser ces méthodes dans quelque chose comme:

- (void)mouseDown:(NSEvent *)theEvent 
{  
    [self setCursor:CursorTypeClicked]; 
} 

ou où tu veux. N'oubliez pas d'implémenter Enum avec votre curseur et de charger les curseurs dans votre méthode d'initialisation!

Espérons que cela aide.

+1

Merci. Par ailleurs '[self.window invalidateCursorRectsForView: self];' fonctionne aussi – hockeyman

+0

Comment puis-je faire ça avec swift? ' –

2

Si vous voulez juste une solution plus simple, à l'aide des curseurs seulement du système, vous pouvez le faire:

Declare dans le fichier d'en-tête de vue:

NSCursor *currentCursor; 

Mettre en oeuvre cette méthode:

- (void)resetCursorRects 
{ 
    NSSize clientSize = self.frame.size; 
    NSRect clientArea = {0, 0, clientSize.width, clientSize.height}; 
    [self addCursorRect:clientArea cursor:currentCursor]; 
} 

Et il suffit de le faire pour changer le curseur:

currentCursor = [NSCursor arrowCursor]; 
[self discardCursorRects]; 
[currentCursor set]; 

Ou utilisez l'un des autres curseurs définis par le système.