框架如何在macOS上工作

即使约束几乎是在macOS / iOS和tvOS上构建UI的默认设置,在某些情况下,框架仍是首选。 macOS上的帧操作与其对应的帧操作非常相似。 与CGRect一起使用时,您会看到对NSRect的引用,但实际上这只是CGRect的类型别名。 但是,存在一个根本区别,就是坐标系被翻转,或者更确切地说,它在iOS和tvOS上被翻转。
这意味着值为零的x坐标始于其超级视图的底部,而不是其顶部。 值得注意的是,这只会影响x坐标,y坐标的工作方式与您期望的一样。

如果您习惯于在iOS和tvOS上计算帧,那么反过来做所有事情都会是一个挑战。 幸运的是,Apple为我们引入了一个属性,以便在我们想要翻转坐标系时覆盖它,以便x坐标或零表示子视图的顶部。

让我们快速看一下一个非常简单的NSView示例中的外观。

从图像中可以看到,子视图位于左下角。 仅需一行代码,我们就可以反转容器视图以获得所需的行为。

如您所见,我们仅添加了isFlipped的覆盖并将其设置为返回true 。 让我们看看文档中关于isFlipped属性的说法。

此属性的默认值为false,这将导致坐标系不翻转。 在非翻转坐标系中,原点位于视图的左下角,并且正y值向上延伸。 在翻转的坐标系中,原点位于视图的左上角,y值向下延伸。 X值始终向右延伸。

如果希望视图使用翻转的坐标系,请覆盖此属性并返回true。

https://developer.apple.com/documentation/appkit/nsview/1483532-isflipped

因此,通过覆盖该属性,该视图坐标系内的所有内容都将被翻转。 请确保注意,将其他子视图添加到基础子视图将不会继承此子视图,并且如果您还希望翻转那些子视图,则必须重写相同的方法。

为了说明我的意思,让我们看一个最后的例子。

就是这样,在macOS上进行基于帧的计算时,不再麻烦。