Как преобразовать кокард Какао из левого верхнего == источника в нижний левый == источник
Я использую CGWindowListCopyWindowInfo, чтобы получить список всех окон. Это дает мне координаты каждого окна, основываясь на том, что начало координат находится в верхнем левом углу экрана.
Если я использую метод setFrame NSWindow, координаты на основе источника лежат в левом нижнем углу экрана.
Какой чистый, надежный способ конвертировать из одного в другой?
Добавлено: Под чистым и надежным, я имею в виду, что-то обязательно будет работать независимо от того, использует ли пользователь несколько экранов или использует пробелы. Я полагаю, что должна быть известная идиома, использующая библиотечные API.
3 ответа
Математика довольно надежна:-)
yFromBottom = screenHeight - windowHeight - yFromTop
Высота основного экрана
[[[NSScreen screens] objectAtIndex:0] frame].size.height
Я бы предложил использовать NSAffineTransform. Если вы рисуете относительно исходного положения по умолчанию, а затем применяете преобразование к представлению, вы можете по существу перевернуть вещи одним махом.
Попробуйте что-то вроде этого ( отсюда):
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);