Mac OS X Cocoa,在全局屏幕坐标空间中翻转Y坐标

时间:2011-08-01 16:42:09

标签: cocoa macos coordinates coordinate-systems

如何将NSPoint的y值翻转到翻转的坐标空间。

我有两个点来源,都在全局屏幕空间中,但有一个被翻转:

  1. 屏幕坐标空间中的一个,0,0 =左上角。

  2. 屏幕坐标空间中的一个,0,0 =左下角。

  3. 我需要将第二个(左下角)翻转到与左上角相同的空间。我怎么能在NSPoint或CGPoint上做到这一点?

3 个答案:

答案 0 :(得分:3)

对于Mac OSX Cocoa,您可以翻转视图的y坐标,只需覆盖isFlipped即可为每个视图返回YES

- (BOOL)isFlipped {
    return YES;
}

答案 1 :(得分:1)

假设您在左下角坐标空间中有一个点,称为“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

答案 2 :(得分:1)

如果您有多个显示器,则全局坐标空间的总高度可能大于任何单个显示器上的垂直高度。我发现有必要使用以下代码(给定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)