问题描述
在多显示器设置中,我遇到以下情况:
I have the following situation in my multi-monitor setup:
在此示例中,我想将窗口精确定位在黄色箭头所示的坐标处.但是,我所要做的只是一个NSView的坐标,它是一个NSWindow的contentView的子视图,该子视图跨越了整个(更大,更大)的辅助监视器.
In this example I want to position a window exactly at the coordinates depicted with the yellow arrow. All I do have however, are the coordinates of an NSView that is a subview of the contentView of an NSWindow that spans the entire (bigger,upper) secondary monitor.
以下是定义全局坐标空间的方式:
Here's how the global coordinate space is defined:
- {0,0}是我的笔记本电脑屏幕左上角的坐标. (绿色)
- {-296,-1080}是第二个屏幕(黑色)左上角的坐标
- {0,800}是左下角的坐标(此处没有箭头)
因此y从绿色箭头向下增加,而从绿色箭头向上减少.
Thus y is increasing going down from green arrow, decreasing going up from green arrow.
问题:
如何将黄色箭头({100,100},此NSScreen内NSWindow内的NSView)描绘的点转换为该全局坐标系. (注意:在NSView中,坐标系的左下角有{0,0},向上增加.)
How do I convert the point depicted by the yellow arrow ({100,100}, NSView inside NSWindow inside this NSScreen) into that global coordinate system. (Note: In an NSView the coordinate system has {0,0} in the bottom left corner, increasing upwards.)
我相信正确的答案是{-196,-980},但是在任何屏幕上任何窗口进行此转换的代码是什么?
I believe the correct answer is {-196, -980}, but whats the code to get this conversion for any window on any screen?
我已经在这个问题上花费了太多时间,因此非常感谢您的帮助.
I have spent too much time on this problem already, so any help is very appreciated.
(不确定是否相关,但底部屏幕上显示视网膜分辨率.)
(Not sure if relevant, but the bottom screen has a retina resolution display.)
推荐答案
Mac OS在不同的地方使用不同的坐标系.视图可以定义它们的y轴是向上还是向下(isFlipped
).窗口的原点用y轴向上的屏幕坐标"表示.屏幕使用y指向下的全局坐标系进行排列.
Mac OS uses different coordinate systems in various places. Views can define if they have an upwards or downwards pointing y-axis (isFlipped
). A window's origin is expressed in "screen coordinates" with an upwards y-axis. Screens are arranged using the global coordinate system with y pointing down.
最好不要自己尝试转换所有坐标空间,而要让负责的对象来完成这项工作:
It's better not to try to do the conversion of all the coordinate spaces yourself but let the responsible objects do the job:
NSView *yellowView; // your view that contains the point with the yellow arrow.
NSPoint yellowPoint = { 100, 100 };
NSPoint pointInWindow = [yellowView convertPoint:yellowPoint toView:nil];
NSPoint pointOnScreen = [[yellowView window] convertRectToScreen:(CGRect){.origin=pointInWindow}];
NSWindow *newWindow = [[NSWindow alloc] initWithContentRect:(CGRect){ pointOnScreen, {32, 32}} styleMask: ...];
这篇关于Mac OS X:在NSView坐标和全局屏幕坐标之间转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!