gpt4 book ai didi

macos - Mac OS X : Convert between NSView coordinates and global screen coordinates

转载 作者:行者123 更新时间:2023-12-01 17:47:59 57 4
gpt4 key购买 nike

我的多显示器设置中遇到以下情况:

OSX coordinate conversions

在此示例中,我希望将窗口精确定位在黄色箭头所示的坐标处。然而,我所拥有的只是 NSView 的坐标,它是跨越整个(更大、更上面)辅助监视器的 NSWindow 的 contentView 的 subview 。

全局坐标空间的定义方式如下:

  • {0,0} 是我的笔记本电脑屏幕左上角的坐标。 (绿色)
  • {-296, -1080} 是我的第二个屏幕(黑色)左上角的坐标
  • {0, 800} 是左下角的坐标(此处没有箭头)

因此 y 从绿色箭头向下递增,从绿色箭头向上递减。

问题:

如何将黄色箭头({100,100},此 NSScreen 内的 NSWindow 内的 NSView)所描绘的点转换为该全局坐标系。 (注意:在 NSView 中,坐标系的左下角为 {0,0},向上增加。)

我相信正确的答案是 {-196, -980},但是为任何屏幕上的任何窗口获取此转换的代码是什么?

我已经在这个问题上花了太多时间,所以非常感谢任何帮助。

(不确定是否相关,但底部屏幕有视网膜分辨率显示屏。)

最佳答案

Mac OS 在不同地方使用不同的坐标系。 View 可以定义它们是否具有向上或向下的 y 轴 (isFlipped)。窗口的原点以 y 轴向上的“屏幕坐标”表示。屏幕使用 y 向下的全局坐标系进行排列。

最好不要尝试自己完成所有坐标空间的转换,而是让负责的对象完成这项工作:

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: ...];

关于macos - Mac OS X : Convert between NSView coordinates and global screen coordinates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21751105/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com