NSCursor: метод "set" не имеет никакого эффекта - PullRequest
2 голосов
/ 08 декабря 2011

Я работаю над приложением Mac с Xcode (использующим cocos2d), пытаюсь настроить курсор, и метод "set" в некоторых случаях, похоже, не дает никакого эффекта ...

Я ужемне было трудно установить курсор при запуске приложения (NSTimer устанавливал его после того, как приложение было действительно запущено), и теперь я просто хочу, чтобы оно отображало другое изображение, когда пользователь щелкает;Я использую NSNotification для этого, мой класс курсора получает уведомление, затем он должен установить новое изображение, а затем ... ничего.

Вот код, который может помочь:

-(void) click  
{  
    CCLOG(@"Click");  
    NSString *path = [[NSBundle mainBundle] pathForResource:@"point_pressed" ofType:@"png"];  
    NSImage *cursorImage = [[[NSImage alloc] initByReferencingFile:path] autorelease];  
    NSCursor *cursor = [[NSCursor alloc] initWithImage:cursorImage hotSpot:[[NSCursor currentCursor] hotSpot]];  
    [cursor set];  
}  

При инициализации:

    [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(updateCursor:) userInfo:nil repeats:NO];  

И метод:

-(void) updateCursor:(id)sender  
{  
    CCLOG(@"Update cursor");  
    [[self.cursorsDict objectForKey:@"point"] set];  
}  

Метод «updateCursor» также вызывается, когда приложение становится активным, и затем оно работает нормально, отображается правильный курсор.
Я пробовал много вещей, методы pop и push, «setOnMouseEnter» (хотя я не использую rectпока), но безрезультатно ...
Кто-нибудь знает об этом?

Редактировать:

Незнакомец, я написал метод appWake:

-(void) appWake
{
    int i = rand()%3;
    if(i==0)
        [[self.cursorsDict objectForKey:@"point"] set];
    else if(i==1)
        [[self.cursorsDict objectForKey:@"point_pressed"] set];
    else if(i==2)
        [[self.cursorsDict objectForKey:@"open"] set];
    self.state = ECursorState_Point;
    [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(appWake) userInfo:nil repeats:NO];
}

Который вызывается уведомлением:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWake) name:EVENT_APPLICATION_DID_BECOME_ACTIVE object:nil];

Устанавливается в appDelegate с помощью:

-(void) applicationDidBecomeActive:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] postNotificationName:EVENT_APPLICATION_DID_BECOME_ACTIVE object:nil];
}

И когда он вызывается этим уведомлением, он работает нормально, курсор меняется случайным образом;но если я удаляю уведомление в applicationDidBecomeActive и вызываю его где-то еще в моем коде, то оно ничего не делает (хотя я проверил, что оно вызывается) ...

Ответы [ 3 ]

2 голосов
/ 06 октября 2016

Рабочим решением для меня, чтобы изменить курсор из системного события, было обернуть курсор, установленный внутри async, примерно так:

DispatchQueue.main.async {
    self.customCursor.set()
}

(Swift 3)

1 голос
/ 13 декабря 2012

Я знаю, что это было некоторое время. Но у меня была похожая проблема.

По какой-то причине [курсор установлен] не работает при вызове из событий приложения.

Вот как я это сделал:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self performSelector:@selector(doChangeCursor) withObject:nil afterDelay:1];
}

- (void) doChangeCursor
{
    NSString *file = [[NSBundle mainBundle] pathForResource:@"statusBarImage" ofType:@"tiff"];
    NSImage *image = [[NSImage alloc] initWithContentsOfFile:file];
    NSCursor *cursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint(0, 0)];
    [cursor set];    
}

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 16 декабря 2011

Ну, я не мог найти решение этой проблемы.Мне пришлось использовать обходной путь: обработать курсор спрайта, установленный в позиции курсора ...

...