Родной OSX Lion изменяет размер курсора для пользовательских NSWindow или NSView
Если мы используем NSTrackingArea
для некоторого указанного региона мы можем реализовать такой метод для изменения курсора по умолчанию:
-(void)cursorUpdate:(NSEvent *)theEvent {
[[NSCursor resizeLeftCursor] set];
}
Я реализую пользовательский размер для NSWindow
, который использует NSBorderlessWindowMask
, И хочу использовать две стрелки курсора родного Льва. Но такого типа курсоров не существует в NSCursor API.
Можно ли как-то получить такие родные курсоры из кода?
Или, может быть, я должен перерисовать их вручную (не очень хорошая идея)?
4 ответа
WebKit содержит изображения, которые выглядят точно так же, как курсоры, используемые системой, в следующем каталоге:
/System/Library/Frameworks/WebKit.framework/Versions/Current/Frameworks/WebCore.framework/Resources/
... например, файл "northWestSouthEastResizeCursor.png".
Те, что присутствуют в WebKit, к сожалению, не доступны в разрешении сетчатки, глядя в
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Resources/cursors
Вы найдете PDF-версию курсоров изменения размера.
Вот пример кода для загрузки векторных (и, следовательно, с поддержкой Retina) курсоров из HIServices.framework:
NSString *cursorName = @"resizenortheastsouthwest";
NSString *cursorPath = [@"/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Resources/cursors" stringByAppendingPathComponent:cursorName];
NSImage *image = [[NSImage alloc] initByReferencingFile:[cursorPath stringByAppendingPathComponent:@"cursor.pdf"]];
NSDictionary *info = [NSDictionary dictionaryWithContentsOfFile:[cursorPath stringByAppendingPathComponent:@"info.plist"]];
NSCursor *cursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint([[info valueForKey:@"hotx"] doubleValue], [[info valueForKey:@"hoty"] doubleValue])];
Обратите внимание, я не знаю, работает ли это в изолированных приложениях.
Существуют недокументированные способы создания таких курсоров. Вот пример:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
if ([NSCursor respondsToSelector:@selector(_windowResizeNorthSouthCursor)])
{
self.resizeUpDownCursor = [NSCursor performSelector:@selector(_windowResizeNorthSouthCursor)];
}
else
{
self.resizeUpDownCursor = [NSCursor resizeUpDownCursor];
}
#pragma clang diagnostic pop
Вот полный список недокументированных курсоров в macOS Sierra:
[NSCursor _windowResizeEastCursor]
[NSCursor _windowResizeWestCursor]
[NSCursor _windowResizeEastWestCursor]
[NSCursor _windowResizeNorthCursor]
[NSCursor _windowResizeSouthCursor]
[NSCursor _windowResizeNorthSouthCursor]
[NSCursor _windowResizeNorthEastCursor]
[NSCursor _windowResizeNorthWestCursor]
[NSCursor _windowResizeSouthEastCursor]
[NSCursor _windowResizeSouthWestCursor]
[NSCursor _windowResizeNorthEastSouthWestCursor]
[NSCursor _windowResizeNorthWestSouthEastCursor]
[NSCursor _zoomInCursor]
[NSCursor _zoomOutCursor]
[NSCursor _helpCursor]
[NSCursor _copyDragCursor]
[NSCursor _genericDragCursor]
[NSCursor _handCursor]
[NSCursor _closedHandCursor]
[NSCursor _moveCursor]
[NSCursor _waitCursor]
[NSCursor _crosshairCursor]
[NSCursor _horizontalResizeCursor]
[NSCursor _verticalResizeCursor]
[NSCursor _bottomLeftResizeCursor]
[NSCursor _topLeftResizeCursor]
[NSCursor _bottomRightResizeCursor]
[NSCursor _topRightResizeCursor]
[NSCursor _resizeLeftCursor]
[NSCursor _resizeRightCursor]
[NSCursor _resizeLeftRightCursor]