【发布时间】:2011-08-01 16:42:08
【问题描述】:
如何将 NSPoint 的 y 值翻转到翻转的坐标空间。
我有两个点源,都在全局屏幕空间中,但一个是翻转的:
屏幕坐标空间中的一个,0,0 = 左上角。
屏幕坐标空间中的一个,0,0 = 左下角。
我需要将第二个(左下角)翻转到与第一个相同的空间,左上角。如何在 NSPoint 或 CGPoint 上做到这一点?
【问题讨论】:
标签: cocoa macos coordinates coordinate-systems
如何将 NSPoint 的 y 值翻转到翻转的坐标空间。
我有两个点源,都在全局屏幕空间中,但一个是翻转的:
屏幕坐标空间中的一个,0,0 = 左上角。
屏幕坐标空间中的一个,0,0 = 左下角。
我需要将第二个(左下角)翻转到与第一个相同的空间,左上角。如何在 NSPoint 或 CGPoint 上做到这一点?
【问题讨论】:
标签: cocoa macos coordinates coordinate-systems
对于 Mac OSX Cocoa,您可以翻转 y 坐标以获得视图,只需覆盖 isFlipped 即可为每个视图返回 YES:
- (BOOL)isFlipped {
return YES;
}
【讨论】:
如果您有多个显示器,则全局坐标空间的总高度可能大于任何单个显示器的垂直高度。我发现有必要使用以下代码(给定originalPoint)来找到它:
let globalHeight = screens.map {$0.frame.origin.y + $0.frame.height}.max()!
let flippedY = globalHeight - originalPoint.y
let convertedPoint = NSPoint(x: originalPoint.x, y: flippedY)
【讨论】:
假设您在左下角坐标空间中有一个点,称为“originalPoint”。要将这个点翻转到左上角坐标空间,可以使用如下代码:
let screenFrame = (NSScreen.main()?.frame)!
let flippedY = screenFrame.size.height - originalPoint.y
let convertedPoint = NSPoint(x: originalPoint.x, y: flippedY)
我们也可以做一个扩展:
extension NSPoint {
var flipped: NSPoint {
let screenFrame = (NSScreen.main()?.frame)!
let screenY = screenFrame.size.height - self.y
return NSPoint(x: self.x, y: screenY)
}
}
用途:
let flippedPoint = originalPoint.flipped
【讨论】: