2011-12-08 14 views
1

私はMacアプリケーションをXcode(cocos2dを使用)で使用してカーソルを設定しようとしていますが、 "set"メソッドはいくつかのケースでは効果がないようです。NSCursor: "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" 方式とも呼ばれる。ここ

は助けるかもしれないいくつかのコードですアプリケーションがアクティブになり、正常に動作すると、正しいカーソルが表示されます。
多くのもの、ポップ、プッシュメソッド "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]; 
} 

-(void) applicationDidBecomeActive:(NSNotification *)notification 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:EVENT_APPLICATION_DID_BECOME_ACTIVE object:nil]; 
} 
:によってappDelegateに設定し

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

そして、この通知によって呼び出されると、うまく動作し、カーソルがランダムに変化します。私はapplicationDidBecomeActiveで通知を削除し、私のコードのどこかで呼び出す場合、それは何もしない(私はそれが呼び出されたことを確認したが)...

答えて

0

私はそれがしばらくしていることを知っています。しかし、私にも同様の問題がありました。

アプリケーションイベントから何らかの理由で[カーソルセット]が呼び出されても機能しません。ここで

は、私はそれをやった方法です:

- (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

まあ、それはすべてのことで私は驚かないだろうこれが答えです!私は実際にそれを試してみたいという動機がありません。これは古いコードなので(カーソルの代わりにスプライトを使って別の方法を見つけましたが)、ほとんどのグラフィカル関数はイベントから呼び出されたときに動作します。だから私は答えとしてマークし、私はそれを試してみる機会があればこれを編集します。 – Grhyll

+0

この 'doChangeCursor'は' NSImage'と 'NSCursor'のインスタンスを漏らしているようです。 – JWWalker

+1

JWWalker、あなたはしばらくの間ARCを持っていたことに気付いていますか? –

0

まあ、私はこの問題の解決策を見つけることができませんでした。回避策を使用する必要がありました:カーソルの位置にスプライトカーソルを設定してください。

1

はそうのような非同期の内側に設定され、カーソルをラップしました:

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

(スウィフト3)

関連する問題