Начиная с macOS 10.11, самый простой способ сделать это - использовать новый метод -[NSWindow performWindowDragWithEvent:]
:
@interface MyView () {
BOOL movingWindow;
}
@end
@implementation MyView
...
- (BOOL)mouseDownCanMoveWindow
{
return NO;
}
- (void)mouseDown:(NSEvent *)event
{
movingWindow = NO;
CGPoint point = [self convertPoint:event.locationInWindow
fromView:nil];
// The area in your view where you want the window to move:
CGRect movableRect = CGRectMake(0, 0, 100, 100);
if (self.window.movableByWindowBackground &&
CGRectContainsPoint(movableRect, point)) {
[self.window performWindowDragWithEvent:event];
movingWindow = YES;
return;
}
// Handle the -mouseDown: as usual
}
- (void)mouseDragged:(NSEvent *)event
{
if (movingWindow) return;
// Handle the -mouseDragged: as usual
}
@end
Здесь -performWindowDragWithEvent:
будет обрабатывать правильное поведение, не перекрывая строку меню,а также будет привязан к краям в macOS 10.12 и более поздних версиях.Обязательно включите переменную экземпляра BOOL movingWindow
в частный интерфейс вашего представления, чтобы вы могли избежать событий -mouseDragged:
, если вы определили, что не хотите их обрабатывать.
Здесь мы также проверяем, что -[NSWindow movableByWindowBackground]
установлен на YES
, чтобы этот вид можно было использовать в фоновых окнах с неподвижным окном, но это необязательно.