我使用 CGWindowListCopyWindowInfo 来获取所有窗口的列表。它根据屏幕左上角的原点为我提供每个窗口的坐标。
如果我使用 NSWindow 的 setFrame 方法,则坐标基于屏幕左下角的原点。
什么是从一种转换到另一种的干净、可靠的方法?
补充:干净和可靠,我的意思是,无论用户是否有多个屏幕或正在使用 Spaces,某些东西都可以正常工作。我认为必须有一个使用库 API 的已知习语。
我使用 CGWindowListCopyWindowInfo 来获取所有窗口的列表。它根据屏幕左上角的原点为我提供每个窗口的坐标。
如果我使用 NSWindow 的 setFrame 方法,则坐标基于屏幕左下角的原点。
什么是从一种转换到另一种的干净、可靠的方法?
补充:干净和可靠,我的意思是,无论用户是否有多个屏幕或正在使用 Spaces,某些东西都可以正常工作。我认为必须有一个使用库 API 的已知习语。
数学相当可靠:-)
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);