你如何翻转NSView的坐标系?

roc*_*711 28 cocoa objective-c

我在界面构建器中创建了一个NSScrollView,它具有可变数量的半唯一NSView,可以通过编程方式添加和删除它.当我将subViews添加到documentView时,它们出现在左下角而不是左上角.我看到你可以检查isFlipped bool来判断视图的坐标系是否被翻转,但我找不到将其设置为翻转的方法.

谁知道我错过了什么?

Mar*_*eau 46

在NSView子类中,重写isFlipped方法:

isFlipped如果接收器使用翻转的绘图坐标,则返回YES;如果使用本机坐标,则返回NO.

NSView

讨论默认实现返回NO; 使用翻转坐标的子类应重写此方法以返回YES.


Jay*_*Jay 24

对于希望在Swift中执行此操作的任何人,您可以在自定义类中覆盖:

class FlippedView: NSView {
    override var flipped:Bool {
        get {
            return true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以做没有子类化的事情吗? (6认同)
  • 这似乎是显而易见的,应该有一种方法在Interface构建器中执行它,而不必诉诸子类. (2认同)
  • @yukas这个想法是,每个单独的视图都有自己的绘制方式(例如,使用人工计算的向量),如果您突然翻转其坐标平面,可能会变得非常奇怪(光栅可能没问题,而路径可能会颠倒绘制) )。因此,它是不可设置的,但子类可以指定“isFlipped”,因为它们知道视图是如何绘制的。 (2认同)

Sup*_*tar 5

这个想法是每个单独的视图都有自己的绘制方式(例如,使用人工计算的路径)如果你突然翻转它的坐标平面可能会变得非常不稳定(光栅可能很好,而路径可能会倒置,计算可能会将东西放在屏幕外等)。所以它不是可设置的,但子类可以指定,isFlipped因为他们肯定知道视图是如何绘制的。

子类也可以设置它,但是他们必须期望它随时更改。

至于代码,这是JaySwift 5 中的回答

open class FlippedView: NSView {
    override var isFlipped: Bool { true }
}
Run Code Online (Sandbox Code Playgroud)