21

タイトル バーのすぐ下、上部にタブ バーがあるテクスチャ ウィンドウを使用しています。

ウィンドウで使用-setContentBorderThickness:forEdge:して、グラデーションを正しく表示し、シートが正しい位置からスライドするようにしました。

ただし、機能していないのは、ウィンドウをドラッグすることです。実際にはタイトル バーである領域をクリックしてドラッグすると機能しますが、タイトル バーのグラデーションが (潜在的/多くの場合空の) タブ バーに流れ込むため、クリックが低すぎると非常に簡単になり、ドラッグしよとすると非常にイライラします。ウィンドウが動いていないことに気づきます。

NSToolbarは、タイトル バーの下にほぼ同じ量のスペースを占めていますが、カーソルがその上にあるときにウィンドウをドラッグできることに気付きました。これをどのように実装しますか?

ありがとう。

タブバー

4

9 に答える 9

16

ここでこれを見つけました:

-(void)mouseDown:(NSEvent *)theEvent {    
    NSRect  windowFrame = [[self window] frame];

    initialLocation = [NSEvent mouseLocation];

    initialLocation.x -= windowFrame.origin.x;
    initialLocation.y -= windowFrame.origin.y;
}

- (void)mouseDragged:(NSEvent *)theEvent {
    NSPoint currentLocation;
    NSPoint newOrigin;

    NSRect  screenFrame = [[NSScreen mainScreen] frame];
    NSRect  windowFrame = [self frame];

    currentLocation = [NSEvent mouseLocation];
    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) > (screenFrame.origin.y+screenFrame.size.height) ){
        newOrigin.y=screenFrame.origin.y + (screenFrame.size.height-windowFrame.size.height);
    }

    //go ahead and move the window to the new location
    [[self window] setFrameOrigin:newOrigin];
}

正常に動作しますが、正しく動作しているとは 100% 確信が持てません。これまでに発見したバグが 1 つあります。それは、ドラッグがサブビュー (タブ自体) 内で開始され、スーパービュー (タブ バー) に入った場合です。窓が飛び跳ねる。一部の -hitTest: 魔法、またはおそらく mouseUp で initialLocation を無効にすることでさえ、おそらくそれを修正するはずです。

于 2010-12-30T17:10:11.130 に答える
11

2つのステップの後、私にとってはうまくいきます:

  1. NSView をサブクラス化し、mouseDownCanMoveWindowYES を返すようにオーバーライドします。
  2. NSWindow をサブクラス化し、isMovableByWindowBackgroundYES を返すようにオーバーライドします。
于 2014-10-24T08:20:02.233 に答える
11

NSView メソッドmouseDownCanMoveWindowをオーバーライドして を返してみましたYESか?

于 2010-12-30T16:07:25.060 に答える
4

とても簡単です:

mouseDownCanMoveWindowプロパティをオーバーライドする

override var mouseDownCanMoveWindow:Bool {
    return false
}
于 2014-11-22T14:26:45.657 に答える
4

NSTableViewウィンドウに があり、選択が有効になっている場合、プロパティのオーバーライドは機能しmouseDownCanMoveWindowません。

NSTableView代わりに、サブクラスを作成し、次のマウス イベントをオーバーライドする必要があります ( Dimitri answerperformWindowDragWithEvent:に記載されているものを使用します)。

@interface WindowDraggableTableView : NSTableView
@end

@implementation WindowDraggableTableView 
{
    BOOL _draggingWindow;
    NSEvent *_mouseDownEvent;
}

- (void)mouseDown:(NSEvent *)event
{
    if (self.window.movableByWindowBackground == NO) {
        [super mouseDown:event]; // Normal behavior.
        return;
    }

    _draggingWindow = NO;
    _mouseDownEvent = event;
}

- (void)mouseDragged:(NSEvent *)event
{
    if (self.window.movableByWindowBackground == NO) {
        [super mouseDragged:event]; // Normal behavior.
        return;
    }

    assert(_mouseDownEvent);
    _draggingWindow = YES;
    [self.window performWindowDragWithEvent:_mouseDownEvent];
}

- (void)mouseUp:(NSEvent *)event
{
    if (self.window.movableByWindowBackground == NO) {
        [super mouseUp:event]; // Normal behavior.
        return;
    }

    if (_draggingWindow == YES) {
        _draggingWindow = NO;
        return; // Event already handled by `performWindowDragWithEvent`.
    }

    // Triggers regular table selection.
    NSPoint locationInWindow = event.locationInWindow;
    NSPoint locationInTable = [self convertPoint:locationInWindow fromView:nil];
    NSInteger row = [self rowAtPoint:locationInTable];
    if (row >= 0 && [self.delegate tableView:self shouldSelectRow:row])
    {
        NSIndexSet *rowIndex = [NSIndexSet indexSetWithIndex:row];
        [self selectRowIndexes:rowIndex byExtendingSelection:NO];
    }
}

@end

movableByWindowBackgroundまた、対応するウィンドウプロパティも設定することを忘れないでください。

self.window.movableByWindowBackground = YES;
于 2018-02-17T17:21:50.517 に答える