Перемещение NSWindow без полей полностью покрыто Web View - PullRequest
3 голосов
/ 02 сентября 2011

В моем приложении COCOA я реализовал собственное окно без полей.Область содержимого окна полностью покрыта WebView.Я хочу, чтобы это окно без полей перемещалось, когда пользователь щелкает мышью и перетаскивает мышью в любую область содержимогоЯ пытался переопределить isMovableByWindowBackground, но бесполезно.Как я могу решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 13 июня 2013

Вот как я это сделал.

#import "BorderlessWindow.h"


@implementation BorderlessWindow

@synthesize initialLocation;

- (id)initWithContentRect:(NSRect)contentRect
            styleMask:(NSUInteger)windowStyle
              backing:(NSBackingStoreType)bufferingType
                defer:(BOOL)deferCreation
{
if((self = [super initWithContentRect:contentRect 
                                  styleMask:NSBorderlessWindowMask 
                              backing:NSBackingStoreBuffered 
                                defer:NO]))
{
    return self;
}

return nil;
}

- (BOOL) canBecomeKeyWindow
{
return YES;
}

- (BOOL) acceptsFirstResponder
{
return YES;
}

- (NSTimeInterval)animationResizeTime:(NSRect)newWindowFrame
{
return 0.1;
}

- (void)sendEvent:(NSEvent *)theEvent
{
if([theEvent type] == NSKeyDown)
{
    if([theEvent keyCode] == 36)
        return;
}

if([theEvent type] == NSLeftMouseDown)
    [self mouseDown:theEvent];
else if([theEvent type] == NSLeftMouseDragged)
    [self mouseDragged:theEvent];

[super sendEvent:theEvent];
}


- (void)mouseDown:(NSEvent *)theEvent
{    
self.initialLocation = [theEvent locationInWindow];
}

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

NSPoint currentLocation = [theEvent locationInWindow];
if(initialLocation.y > windowFrame.size.height - 40)
{
    newOrigin.x += (currentLocation.x - initialLocation.x);
    newOrigin.y += (currentLocation.y - initialLocation.y);

    if ((newOrigin.y + windowFrame.size.height) > (screenVisibleFrame.origin.y + screenVisibleFrame.size.height))
    {
        newOrigin.y = screenVisibleFrame.origin.y + (screenVisibleFrame.size.height - windowFrame.size.height);
    }

    [self setFrameOrigin:newOrigin];
}
}


@end

И .h файл:

#import <Cocoa/Cocoa.h>
@interface BorderlessWindow : NSWindow {
NSPoint initialLocation;
}

- (id)initWithContentRect:(NSRect)contentRect
            styleMask:(NSUInteger)windowStyle
              backing:(NSBackingStoreType)bufferingType
                defer:(BOOL)deferCreation;

 @property (assign) NSPoint initialLocation;

 @end
2 голосов
/ 04 сентября 2011

Вызов -setMovableByWindowBackround: ДА в WebView и создание текстурированного окна может работать.

1 голос
/ 04 марта 2019

Так как это лучший хит в Google ... предоставленный подход не сработал для меня, так как WKWebView перехватывает события мыши до того, как они достигают окна. Вместо этого мне пришлось создать подкласс WKWebView и выполнить работу там (например, Редактор фотографий Apple / WindowDraggableButton.swift ).

Я использую Xamarin, но код довольно прост ... вот важные биты:

// How far from the top of the window you are allowed to grab the window
// to begin the drag...the title bar height, basically
public Int32 DraggableAreaHeight { get; set; } = 28;

public override void MouseDown(NSEvent theEvent)
{
    base.MouseDown(theEvent);

    var clickLocation = theEvent.LocationInWindow;
    var windowHeight = Window.Frame.Height;

    if (clickLocation.Y > (windowHeight - DraggableAreaHeight))
        _dragShouldRepositionWindow = true;
}

public override void MouseUp(NSEvent theEvent)
{
    base.MouseUp(theEvent);
    _dragShouldRepositionWindow = false;
}

public override void MouseDragged(NSEvent theEvent)
{
    base.MouseDragged(theEvent);
    if (_dragShouldRepositionWindow)
    {
        this.Window.PerformWindowDrag(theEvent);
    }
}

0 голосов
/ 12 июня 2019

@ starkos дал правильный ответ на https://stackoverflow.com/a/54987061/140927 Ниже приведена только реализация ObjC в подклассе WKWebView:

BOOL _dragShouldRepositionWindow = NO;

- (void)mouseDown:(NSEvent *)event {
    [super mouseDown:event];
    NSPoint loc = event.locationInWindow;
    CGFloat height = self.window.frame.size.height;
    if (loc.y > height - 28) {
        _dragShouldRepositionWindow = YES;
    }
}

- (void)mouseUp:(NSEvent *)event {
    [super mouseUp:event];
    _dragShouldRepositionWindow = NO;
}

- (void)mouseDragged:(NSEvent *)event {
    [super mouseDragged:event];
    if (_dragShouldRepositionWindow) {
        [self.window performWindowDragWithEvent:event];
    }
}

Для получения дополнительной информации о том, как управлять строкой заголовка, см. https://github.com/lukakerr/NSWindowStyles

...