Как преобразовать кокард Какао из левого верхнего == источника в нижний левый == источник - PullRequest
9 голосов
/ 12 мая 2009

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

Если я использую метод setFrame NSWindow, координаты, основанные на начале координат, являются внизу слева экрана.

Какой чистый, надежный способ конвертировать из одного в другой?

Добавлено: Под чистым и надежным я имею в виду что-то, что обязательно сработает, независимо от того, использует ли пользователь несколько экранов или использует пробелы. Я полагаю, что должна быть известная идиома, использующая библиотечные API.

Ответы [ 3 ]

11 голосов
/ 12 мая 2009

Математика довольно надежна: -)

yFromBottom = screenHeight - windowHeight - yFromTop

Высота основного экрана

[[[NSScreen screens] objectAtIndex:0] frame].size.height
3 голосов
/ 12 мая 2009

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

2 голосов
/ 12 мая 2009

Попробуйте что-то вроде этого ( отсюда ):

NSRect boundsInWindow = [myView convertRect:[myView bounds] toView:nil];
NSRect visibleRectInWindow = [myView convertRect:[myView visibleRect] toView:nil];

// Flip Y to convert NSWindow coordinates to top-left-based window coordinates.
float borderViewHeight = [[myView window] frame].size.height;
boundsInWindow.origin.y = borderViewHeight - NSMaxY(boundsInWindow);
visibleRectInWindow.origin.y = borderViewHeight - NSMaxY(visibleRectInWindow);
...