Невозможно перетащить или переместить пользовательский NSWindow

Я создаю NSWindowController и NSViewController с помощью Interface Builder, а затем я удалил строку заголовка NSWindow's, чтобы я мог настроить окно. я создаю подкласс класса NSWindow и делаю следующие вещи в классе.

override var canBecomeKey: Bool {
    return true
}

override var canBecomeMain: Bool {
    return true
}

я также установил это в NSWindowController:

{  
    self.window?.becomeKey()
    self.window?.isMovableByWindowBackground = true
    self.window?.isMovable = true;
    self.window?.acceptsMouseMovedEvents = true
}

отсюда пользовательское окно можно перетаскивать,
но когда я делаю NSViewController как NSWindowController's ContentViewController, я не могу перетаскивать customWindow.

Что здесь может происходить?


person J.Wu    schedule 26.11.2016    source источник


Ответы (2)


У меня была эта проблема раньше, вот мое решение, которое работает (хотя оно находится в Objective-C, поэтому просто выбросьте его, если это поможет):

@property BOOL mouseDownInTitle;

- (void)mouseDown:(NSEvent *)theEvent
{
   self.initialLocation = [theEvent locationInWindow];
   NSRect windowFrame = [self frame];
   NSRect titleFrame = NSMakeRect(0, windowFrame.size.height-40, windowFrame.size.width, 40);
   NSPoint currentLocation = [theEvent locationInWindow];

   if(NSPointInRect(currentLocation, titleFrame))
   {
      self.mouseDownInTitle = YES;
   }
}

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

      NSPoint newOrigin = windowFrame.origin;
      NSPoint currentLocation = [theEvent locationInWindow];



      // Update the origin with the difference between the new mouse location and the old mouse location.
      newOrigin.x += (currentLocation.x - self.initialLocation.x);
      newOrigin.y += (currentLocation.y - self.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);
      }

      [self setFrameOrigin:newOrigin];
   }
}
person A O    schedule 26.11.2016
comment
Я уже использовал метод, который вы посоветовали, но он не работает для меня. когда я перетащу вид, он исчезнет, ​​я подумал, что, возможно, что-то не так с набором кадров моего перетаскиваемого вида. - person J.Wu; 28.11.2016

Управляющим фактором здесь является свойство представления mouseDownCanMoveWindow. По умолчанию это, в свою очередь, зависит от его свойства isOpaque. Если вы или один из ваших суперклассов переопределяете isOpaque для возврата true, то реализация mouseDownCanMoveWindow по умолчанию вернет false. Если вы хотите, чтобы он вел себя по-другому, вы должны переопределить и это.

person Ken Thomases    schedule 26.11.2016
comment
Я уже нашел свою проблему, когда я перетаскиваю, то, что я на самом деле перетаскиваю, - это представление NSViewController, я делаю окно невидимым, я думал, что это окно, но это не так. я все еще смущен тем, что я добавляю вид в пользовательское окно с помощью xib, это работает, но добавляю вид контроллера в пользовательское окно, это не работает - person J.Wu; 28.11.2016