1


NSWindow画面上でドラッグできるシンプルなアイコンが入っ た透過があります。
私のコードは:
.h:

@interface CustomView : NSWindow{
}

@property (assign) NSPoint initialLocation;

.m

@synthesize initialLocation;

- (id) initWithContentRect: (NSRect) contentRect
                 styleMask: (NSUInteger) aStyle
                   backing: (NSBackingStoreType) bufferingType
                     defer: (BOOL) flag{
    if (![super initWithContentRect: contentRect 
                          styleMask: NSBorderlessWindowMask 
                            backing: bufferingType 
                              defer: flag]) return nil;
    [self setBackgroundColor: [NSColor clearColor]];
    [self setOpaque:NO];
    [NSApp activateIgnoringOtherApps:YES];
    return self;
}

- (void)mouseDragged:(NSEvent *)theEvent {
    NSRect screenVisibleFrame = [[NSScreen mainScreen] visibleFrame];
    NSRect windowFrame = [self frame];
    NSPoint newOrigin = windowFrame.origin;

    // Get the mouse location in window coordinates.
    NSPoint currentLocation = [theEvent locationInWindow];
    // Update the origin with the difference between the new mouse location and the old mouse location.
    newOrigin.x += (currentLocation.x - initialLocation.x);
    newOrigin.y += (currentLocation.y - initialLocation.y);

    // Don't let window get dragged up under the menu bar
    if ((newOrigin.y + windowFrame.size.height) > (screenVisibleFrame.origin.y + screenVisibleFrame.size.height)) {
        newOrigin.y = screenVisibleFrame.origin.y + (screenVisibleFrame.size.height - windowFrame.size.height);
    }

    // Move the window to the new location
    [self setFrameOrigin:newOrigin];
}

- (void)mouseDown:(NSEvent *)theEvent {    
    // Get the mouse location in window coordinates.
    self.initialLocation = [theEvent locationInWindow];
}

NSPopoverユーザーが透明なウィンドウの画像をクリックしたときに を表示したい。ただし、コードでわかるように、mouseDownイベントはマウスの位置を取得するために使用されます (上記のコードは例から取得したものです)。
ユーザーがアイコンをクリックしてドラッグしたり、単にアイコンをクリックして表示したりしたことを知るにはどうすればよいNSPopoverですか?
ありがとうございました

4

1 に答える 1

3

これは、アクションを開始するために定義イベントが必要になった後に、定義イベントを受け取るという典型的な状況です。具体的には、ドラッグが開始されるまで、mouseDown がドラッグの開始であるかどうかを知ることはできません。ただし、ドラッグが開始されない場合は、その mouseDown を操作する必要があります。

iOS では (ここでのコードとは直接関係ないことはわかっていますが、説明用です)、iOS がこの種の決定を行えるようにするために構築された API 全体があります。Gesture システム全体は、ユーザーがさまざまなアクションの 1 つである可能性のある何かを開始するという考えに基づいているため、時間の経過とともに解決する必要があり、追跡期間中にアクションがキャンセルされる可能性があります。

OS X では、これを支援するシステムがあまりないため、クリックとドラッグを別々に処理する必要がある場合は、ガード タイムが経過するまで次のアクションを延期する必要があります。合格すると、元のアクションを実行できます。この場合、次のことを行う必要があります。

で、後でコールバックしてポップオーバーをトリガーするために、適切なガード タイムmouseDownのセットを開始しますNSTimer(ユーザーが誤ってポインターを移動するほど長くなく、ユーザーがドラッグする前にトリガーするほど短くはありません)。

ではmouseDragged、ガード エリアを使用して、ユーザーが少しひねっただけでもドラッグとしてカウントされないようにします。ドラッグを開始するために必要と思われるよりも遠くに何かをドラッグする必要がある場合があるため、これはイライラする可能性があります。そのため、魔法の定数をどこかで見つけるか、実験を行う必要があります。NSTimerガード エリアを超えたら、 withをキャンセルしてドラッグ操作を開始し[timer invalidate]、ドラッグを実行します。

タイマーのコールバックで、ポップオーバーを表示します。ユーザーがドラッグした場合、ウィルはNSTimer無効化されており、発火しないため、ポップオーバーは表示されません。

于 2012-06-05T02:24:14.940 に答える