2

mouseOverでパネルを表示しようとしているステータスバーアイテムのみのアプリがあります。カスタム ステータス アイテム (および関連付けられたビュー) を接続して動作させていますが、トラッキング rect は数十回の起動ごとにしかイベントを受信して​​いません。これにより、どこかで競合状態が発生していると思われますが、見つけることができません。カスタム ステータス バーのアイテム ビューでは、次のようになります。

- (id)initWithStatusItem:(NSStatusItem *)statusItem {
    CGFloat itemWidth = [statusItem length];
    CGFloat itemHeight = [[NSStatusBar systemStatusBar] thickness];
    NSRect itemRect = NSMakeRect(0.0, 0.0, itemWidth, itemHeight);
    NSLog(@"itemRect: %@", NSStringFromRect(itemRect));

    if ((self = [super initWithFrame:itemRect])) {
        _statusItem = statusItem;
        _statusItem.view = self;

        NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways;
        NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:itemRect
                                                                    options:options
                                                                      owner:self
                                                                   userInfo:nil];
        [self addTrackingArea:trackingArea];

        [self.window setIgnoresMouseEvents:NO];
        [self.window setAcceptsMouseMovedEvents:YES];

        self.wantsLayer = YES;
    }
    return self;
}

- (void)mouseEntered:(NSEvent *)theEvent {
    [[NSNotificationCenter defaultCenter] postNotificationName:UAStatusItemMouseEnteredNotification object:nil];
}

- (void)mouseExited:(NSEvent *)theEvent {
    [[NSNotificationCenter defaultCenter] postNotificationName:UAStatusItemMouseExitedNotification object:nil];
}

ほとんどの起動では、アプリはトラッキング マウス イベントに応答しませんが、ときどきメソッドmouseEntered:mouseExited:メソッドが適切に呼び出され、完全に混乱します。ここで何が起こっていて、何が間違っていますか?




EDIT 07/17/2012 @Streams
の回答に基づいてコードを変更しましたが、同じ問題が発生しました。

- (id)initWithStatusItem:(NSStatusItem *)statusItem {
    CGFloat itemWidth = [statusItem length];
    CGFloat itemHeight = [[NSStatusBar systemStatusBar] thickness];
    NSRect itemRect = NSMakeRect(0.0, 0.0, itemWidth, itemHeight);
    NSLog(@"itemRect: %@", NSStringFromRect(itemRect));

    if ((self = [super initWithFrame:itemRect])) {
        _statusItem = statusItem;
        _statusItem.view = self;            

        [self updateTrackingAreas];

        [self.window setIgnoresMouseEvents:NO];
        [self.window setAcceptsMouseMovedEvents:YES];

        self.wantsLayer = YES;
    }
    return self;
}

- (void)updateTrackingAreas {

    if (self.trackingArea)
        [self removeTrackingArea:self.trackingArea];

    [super updateTrackingAreas];

    self.trackingArea = [[NSTrackingArea alloc] initWithRect:CGRectZero
                                                     options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways
                                                       owner:self
                                                    userInfo:nil];
    [self addTrackingArea:self.trackingArea];
}




EDIT 07/18/2012 これは、よく知られている github プロジェクト (@Stream によって作成された) を使用して問題を示す
ベアボーンサンプル プロジェクトです。マウスオーバー イベントを確実に受け取ることはできません。

4

2 に答える 2

3

私はDTSリクエストを開いて、Appleにこれを見てもらいました。応答は次のとおりです。

...アプリの起動時にXcodeでフルスクリーンを使用しています。以前はこれを行っていませんでしたが、問題を再現できるようになりました。私が知る限り、Xcodeでアプリがフルスクリーンモードから起動された場合にのみ発生します。ユーザーはこの方法でアプリを起動しません。これはAppKitのフルスクリーンモードの問題であり、必ずしもコードの問題ではありません。

于 2012-07-23T22:35:01.927 に答える
0

でのみトラッキング エリアを管理する必要があると思います-[NSView updateTrackingAreas]。例えば:

- (void)updateTrackingAreas
{
    if (_trackingArea) {
        [self removeTrackingArea:_trackingArea];
    }

    [super updateTrackingAreas];

    NSTrackingAreaOptions options = (NSTrackingMouseEnteredAndExited |
                                     NSTrackingMouseMoved |
                                     NSTrackingInVisibleRect |
                                     NSTrackingActiveAlways);
    _trackingArea = [[NSTrackingArea alloc] initWithRect:CGRectZero
                                                 options:options
                                                   owner:self
                                                userInfo:nil];
    [self addTrackingArea:_trackingArea];
}
于 2012-07-17T22:18:53.717 に答える