2009-11-07 3 views
5

Я пишу приложение, которое имеет обычай, прозрачный NSWindow создан с использованием подкласса NSWindow со следующим:Есть ли способ, чтобы сделать собственную NSWindow работу с Spaces

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 
{ 
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:bufferingType defer:flag]; 

    if (self) 
    { 
    [self setOpaque:NO]; 
    [self setBackgroundColor:[NSColor clearColor]]; 
    } 

    return self; 
} 

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

- (BOOL)canBecomeMainWindow 
{ 
    return YES; 
} 

Я все прекрасно работает, включая перетаскивание и изменение размера, за исключением того, что окно не работает с пространством. Я не могу переместить окно в другое пространство, либо удерживая окно при переключении пробелов с помощью сочетания клавиш, либо перетаскивая его в нижнее/верхнее/левое/право окно. Есть ли в любом случае, что пользовательское окно ведет себя точно так же, как обычное окно в отношении пространств?

+0

Я столкнулся с той же проблемой ... нашли ли вы решение? может быть, частный API? http://stackoverflow.com/questions/6250864/change-to-other-space-macosx-programmatically – nacho4d

ответ

0

Вы переопределили isMovable?
Apple documentation говорит, что он меняет поведение пространства:

Если окно возвращает NO, это означает, что можно перетаскивать только между пространствами в режиме F8, ...

Другой метод которые могут быть связаны: NSWindow setCollectionBehavior

+0

К сожалению, isMovable не имеет эффекта, а setCollectionBehavior позволяет мне заставить приложение появляться во всех пространствах. Я обнаружил, что с помощью setMovableByWindowBackground все работает в отношении Spaces, но это мешает моему пользовательскому коду перетаскивания и изменения размера, чего я не хочу. Поэтому setMovableByWindowBackground должен делать что-то, что позволяет перемещать окно между пробелами. –

6

После долгого времени я нашел решение этой досадной проблемы. Действительно [window setMovableByWindowBackground:YES]; конфликтует с моими собственными методами изменения размера, окно дрожит, это выглядит ужасно!

Но доминирующие методы событий мыши, как показано ниже решить проблему в моем случае :)

- (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]; 
} 

Всех моих методов изменения размера начинаются в 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]; 
    } 
} 

Теперь у меня есть настраиваемое окно и играет хорошо с пробелами :)

1

Две вещи здесь.

Вам необходимо установить окно, позволяющее перетаскивать фон, [window setMovableByWindowBackground: YES];

И Если ваши пользовательские области окна вы ожидаете, чтобы быть перетаскиваемыми являются пользовательскими NSView подклассов, вы должны переопределить метод - (BOOL)mouseDownCanMoveWindow вернуть YES в любом NSView подклассе, который должен быть в состоянии переместить окно с помощью перетаскивания ,

Смежные вопросы