我有一个nsscrollview填充整个窗口并显示巨大的图像。现在,我想在滚动视图的某些部分(例如,高度和窗口宽度)叠加自定义NSVIEW,以显示其他信息。当用户滚动滚动视图时,顶部的自定义NSView应留在原处。

我尝试了以下内容:

  1. 创建一个窗口大小的nsview实例
  2. 添加NSSCrollView作为先前生成的NSView的子视图
  3. 在步骤1中将我的自定义视图作为子视图添加到NSView

这在开始时起作用,滚动视图正确显示,我的自定义nsview也是如此。但是,一旦我开始移动滚动视图(滚动),自定义NSView与NSSCrollview的内容一起滚动,当它移至边界外和位置的滚动视图的部分时,它最终消失了,将变为Redrawn 。我如何有效地将自定义NSview层成NSSCrollView的顶部并确保它保持放置?

谢谢!

有帮助吗?

解决方案

我知道您已经为此提供了一个工作解决方案,但是我最近本人正在寻找同一件事,我遇到了 lkoverlaywindow 路易斯·克拉森(Louis Klaassen)的课程似乎为这种覆盖层提供了简单的解决方案。

如在 Cocoadev Wiki, ,您只需要在接口构建器中创建一个新的NSWINDOW,使其成为Lkoverlaywindow的实例,然后通过插座连接NSSCrollView或在代码中指定它。一旦连接到滚动视图,lkoverlaywindow的内容将覆盖滚动视图并在移动并进行调整时跟踪它(后者似乎仅适用于NSSCrollview作为窗口的出口)。作者提供了一个示例项目 这里.

我本来将竭尽全力将NSSCrollview划分,但是在我的情况下,这要容易得多。

其他提示

您有两个选择:

首先,关闭“滚动复制”。您可以直接在IB中或设置 copiesOnScroll 选项 contentView 成员 NSScrollView. 。默认情况下,该选项将其滚动视图“在滚动时复制其现有的渲染图像(仅在其文档视图的暴露部分中复制其现有渲染图像””。如果关闭,“它迫使其内容每次都被重新绘制。”因此,如果性能不是一个大问题,则可以将其关闭。

但是,将其进行使内容必须每次重新绘制,如果您在滚动视图中进行复杂的绘图,则可能会引起重大的性能问题。

第二个选项是将“滚动复制”打开,然后创建一个包含叠加视图的无边界窗口。这确实不像听起来那样令人毛骨悚然 NSWindow 实例作为当前窗口的孩子,使其在移动时自动与主窗口一起移动。

roundtransparentwindow 示例将为您提供一个很好的例子,以创建包含您覆盖的窗口。然后,只需使用Nswindow的 addChildWindow 将其连接到主窗口。

请注意,通过这种方法,您需要处理覆盖窗口的演示时间和隐藏的时间。当您最大化父窗口位置不会自动调整时,似乎也是如此。因此,您也必须处理。但是,如果您不想牺牲有时使用“滚动复制”时有时会改善的大规模性能,这是一个很好的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top