2015-05-10 4 views
3

У меня есть NSWindow с расщепленным экраном, похожим на напоминания. Поэтому я использую этот код:Сделать NSWindow с прозрачным заголовком частично неподвижным

self.window.titlebarAppearsTransparent = true 
self.window.styleMask |= NSFullSizeContentViewWindowMask 

Это прекрасно работает. Но внутри окна у меня есть SplitView (например, в приложении Reminders) и NSOutlineView с правой стороны. OutlineView поднимается до верхней части окна.

Проблема заключается в следующем: нажатие и перетаскивание в верхней части OutlineView делает окно подвижным. В любом случае, я могу отключить это, но все еще сохраняя движущую способность в левой части приложения?

+0

Окно перетаскивание является функцией оконный сервер. Удачи. – CodaFi

ответ

1

Хорошо, есть две вещи, которые нужно сделать:

Сначала вам нужно установить окно, чтобы быть не подвижна. Для этого подкласс вашего окна и переопределить isMovable и вернуть номер. Или вы вызываете setMovable: и устанавливаете его в нет.

После этого вам необходимо вручную перетащить перетаскивание, добавив представление, которое имеет точный размер и положение области, которую вы хотите перетащить. В качестве альтернативы вы можете установить NSTrackingArea. В любом случае вам необходимо переопределить mouseDown: и вставить код для перемещения окна.

Мои слова в коде:

Objective-C

[self.window setMovable:false]; 

// OR (in NSWindow subclass) 

- (BOOL)isMovable { 
    return false; 
} 

//Mouse Down 
- (void)mouseDown:(NSEvent *)theEvent { 
    _initialLocation = [theEvent locationInWindow]; 

    NSPoint point; 
    while (1) { 
     theEvent = [[self window] nextEventMatchingMask: (NSLeftMouseDraggedMask | NSLeftMouseUpMask)]; 
     point =[theEvent locationInWindow]; 

     NSRect screenVisibleFrame = [[NSScreen mainScreen] visibleFrame]; 
     NSRect windowFrame = [self.window frame]; 
     NSPoint newOrigin = windowFrame.origin; 

     // Get the mouse location in window coordinates. 
     NSPoint currentLocation = point; 
     // 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.window setFrameOrigin:newOrigin]; 
    if ([theEvent type] == NSLeftMouseUp) 
     break; 
    } 
} 

initialLocation является NSPoint свойство

Примечание: Я смотрел некоторые вещи here и here

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