Is there a way to make a custom NSWindow work with Spaces

后端 未结 3 1897
别跟我提以往
别跟我提以往 2021-02-03 15:07

I\'m writing an app that has a custom, transparent NSWindow created using a NSWindow subclass with the following:

- (id)initWithContentRect:(NSRect)contentRect s         


        
相关标签:
3条回答
  • 2021-02-03 15:18

    Two things here.

    You need to set the window to allow dragging by background, [window setMovableByWindowBackground:YES];

    And If your custom window areas you expect to be draggable are custom NSView subclasses, you must override the method - (BOOL)mouseDownCanMoveWindow to return YES in any NSView subclass that needs to be able to move the window by dragging.

    0 讨论(0)
  • 2021-02-03 15:28

    After a long time I found a solution to this annoying problem. Indeed [window setMovableByWindowBackground:YES]; conflicts with my own resizing methods, the window trembles, it looks awful!

    But overriding mouse event methods like below solved the problem in my case :)

    - (void)mouseMoved:(NSEvent *)event
    {
        //set movableByWindowBackground to YES **ONLY** when the mouse is on the title bar
        NSPoint mouseLocation = [event locationInWindow];
        if (NSPointInRect(mouseLocation, [titleBar frame])){
            [self setMovableByWindowBackground:YES];
        }else{
            [self setMovableByWindowBackground:NO];
        }
    
        //This is a good place to set the appropriate cursor too
    }
    
    - (void)mouseDown:(NSEvent *)event
    {
        //Just in case there was no mouse movement before the click AND
        //is inside the title bar frame then setMovableByWindowBackground:YES
        NSPoint mouseLocation = [event locationInWindow];
        if (NSPointInRect(mouseLocation, [titleBar frame])){
            [self setMovableByWindowBackground:YES];
        }else if (NSPointInRect(mouseLocation, bottomRightResizingCornerRect)){
            [self doBottomRightResize:event];
        }//... do all other resizings here. There are 6 more in OSX 10.7!
    }
    
    - (void)mouseUp:(NSEvent *)event
    {
        //movableByBackground must be set to YES **ONLY**
        //when the mouse is inside the titlebar.
        //Disable it here :)
        [self setMovableByWindowBackground:NO];
    }
    

    All my resizing methods start in mouseDown:

    - (void)doBottomRightResize:(NSEvent *)event {
        //This is a good place to push the appropriate cursor
    
        NSRect r = [self frame];
        while ([event type] != NSLeftMouseUp) {
            event = [self nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
            //do a little bit of maths and adjust rect r
            [self setFrame:r display:YES];
        }
    
        //This is a good place to pop the cursor :)
    
        //Dispatch unused NSLeftMouseUp event object
        if ([event type] == NSLeftMouseUp) {
            [self mouseUp:event];
        }
    }
    

    Now I have my Custom window and plays nice with Spaces :)

    0 讨论(0)
  • 2021-02-03 15:28

    Did you override isMovable?
    The Apple documentation says, that it changes Spaces behavior:

    If a window returns NO, that means it can only be dragged between spaces in F8 mode, ...

    Another method that might be related: NSWindow setCollectionBehavior

    0 讨论(0)
提交回复
热议问题