3

Xcodeを使用して(cocos2dを使用して)Macアプリケーションで作業していて、カーソルを構成しようとしていますが、「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で通知を削除し、コード内の別の場所で呼び出すと、何も実行されません(呼び出されていることを確認しましたが)...

4

3 に答える 3

3

システムイベントからカーソルを変更するための実用的な解決策は、次のようにカーソルセットを非同期内にラップすることでした:

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

(スイフト3)

于 2016-10-06T20:23:00.823 に答える
1

私はそれがしばらく経ったことを知っています。しかし、私は同様の問題を抱えていました。

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

これが私がやった方法です:

- (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];    
}

これが誰かを助けることができることを願っています。

于 2012-12-12T20:41:03.333 に答える
0

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

于 2011-12-16T10:41:36.243 に答える