11

我有点困惑。苹果文档说明了这一点:

注意:出于性能原因,Cocoa 不强制在同级视图之间进行裁剪,也不保证在同级视图重叠时正确的失效和绘制行为。如果你想在另一个视图前面绘制一个视图,你应该使前视图成为后视图的子视图(或后代)。

所以根据这个,兄弟视图不应该重叠,否则行为是不确定的。

然而,在Cocoa Slides 演示应用程序中,支持图层的 NSView 兄弟姐妹确实重叠,并且似乎工作得很好:

可可幻灯片截图

那么 Cocoa Slides 示例代码是错误的,它的工作原理只是巧合,还是文档已过时?自 10.5 以来已过时,是吗?

4

5 回答 5

10

在 Leopard 和更高版本上,重叠视图可以正常工作,无论是否支持图层。

于 2012-05-23T23:20:03.617 回答
8

经过一番研究,苹果文档似乎确实已经过时了。

从 10.5 开始,支持层的 NSView 兄弟姐妹允许重叠。

这场2009年涉及苹果工程师 David Duncan 和Corbin Dunn的讨论最终提供了一些明确的答案:

重叠视图适用于 Leopard,但在此之前不起作用。文档已过期。

我有一组视图,每个视图内部都有许多较小的视图,它们需要以重叠的方式呈现在窗口上的同一个矩形上,以便它们可以相互看到。在我的初步测试中,我将每个大视图作为单个背景视图的兄弟。计划在必要时通过重新排列 z 顺序将每个都放在前面。这种方法有未来(或现在)吗?

这将适用于 Leopard。

来源: http: //www.cocoabuilder.com/archive/cocoa/228191-nsview-behaves-different-on-10-4-vs-10-5.html#228983

更新詹姆斯登普 西也在推特上回复

我的理解是,从 10.5 开始,重叠的兄弟视图都可以,无论是否有图层支持。

于 2012-05-23T12:37:22.590 回答
4

支持层的视图由 OpenGL 分层(嗯,Quartz 合成器,但它有助于将每一层视为一个带有 OpenGL 纹理的多边形),因此它们始终支持正确的重叠。

CocoaBuilder/Cocoa-Dev 上的线程根本没有提到层。这意味着它谈论没有支持 CALayer 的常规 NSView(或者更确切地说,整个窗口只有一个 CALayer)。

提到的一个例外是 OpenGLView(同样,没有图层),它总是在窗口顶部合成它的 OpenGL 矩形,消除任何子视图。我不认为制作一个支持 NSOpenGLView 层的作品,但可以使用一个 OpenGL 层,它将在其他层之间正确合成。

另一个例外是非层支持视图之上的层,这是有道理的,因为所有非层支持的视图都有效地驻留在一个层中,该层当然位于其任何子层之下(由层支持的视图托管在非层支持的父视图中必须是)。

所以简而言之,它从 10.5 开始适用于非分层视图,并且永远适用于分层支持的视图,当您混合匹配或使用 OpenGL 时需要注意。

PS - 不过,我不是 100% 肯定关于重叠的非层支持视图的声明应该被视为规范。这是苹果工程师的非正式声明。事情可能已经改变,并且可能已经发现了使事情无法正常工作的错误。当我想要正确重叠时,我通常使用图层。

于 2012-05-23T12:58:15.533 回答
2

它可能对某人有用:我遇到了在 MacOS 10.7+ 上闪烁重叠的非分层子视图的问题。在我的应用程序中,视图用于呈现有关所选图形对象(选择框、缩放控制点等)的一些信息,因此它们具有一些动画- 这对我来说是关键。

即使没有图层,重叠的兄弟姐妹似乎也能正常工作,但在更简单的情况下。我有一堆动画视图,每个都有它自己的计时器——它轻弹。我找到了两种解决方案:打开图层同步动画,切换到单个共享计时器并同时更新所有视图。

至少这个技巧在我的应用程序中有所帮助,因为我不想使用图层。

于 2013-02-19T07:56:27.950 回答
2

NSView 兄弟通常允许重叠。不过,您可能会遇到的一件事是 NSScrollView 默认是如何工作的。当您有一个与兄弟视图重叠的香草 NSScrollView 时,事情就会中断。

那是因为 NSClipView 只绘制视图中滚动的部分并复制未更改的内容。当您有与滚动视图重叠的兄弟视图时,此优化不起作用并且视图似乎滚动,即使它们只是兄弟视图。

为了使重叠的同级视图即使在没有层支持的情况下也能正常工作,您因此必须禁用此优化:

[scrollView.contentView setCopiesOnScroll:NO];
于 2015-05-30T18:33:25.843 回答