【问题标题】:Overlay NSView over NSScrollView在 NSScrollView 上覆盖 NSView
【发布时间】:2011-01-18 10:50:41
【问题描述】:

我有一个 NSScrollView 填充整个窗口并显示一个巨大的图像。现在我想在部分滚动视图(例如前 20 个像素高度和窗口宽度)上覆盖一个自定义 NSView 以显示其他信息。当用户滚动滚动视图时,顶部的自定义 NSView 应该保持在原来的位置。

我尝试了以下方法:

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

这在开始时有效,滚动视图正确显示,我的自定义 NSView 也是如此。但是,一旦我开始移动滚动视图(滚动),自定义 NSView 就会与 NSScrollView 的内容一起滚动,并最终在其移动到边界之外时消失,并且它所在的滚动视图部分会重新绘制.我怎样才能有效地将我的自定义 NSView 放在 NSScrollView 之上并确保它保持不变?

谢谢!

【问题讨论】:

  • 我知道早在 2011 年就有人问过这个问题,但如果你今天遇到这个问题只是一个提示。您可以通过简单地制作所有图层支持的视图来解决这个问题。只需为步骤 1 中创建的 NSView 设置 WantLayer。这将使所有子节点递归地支持图层

标签: cocoa overlay nsview nsscrollview


【解决方案1】:

你有两个选择:

首先,关闭“滚动复制”。您可以直接在 IB 中执行此操作,也可以通过在 NSScrollViewcontentView 成员上设置 copiesOnScroll 选项来执行此操作。该选项默认启用,因此滚动视图“在滚动时复制其现有的渲染图像(仅绘制其文档视图的暴露部分)”。如果关闭,“它会强制每次重绘其内容”。因此,如果性能不是大问题,只需将其关闭即可。

但是,如果您在滚动视图中进行复杂的绘图,那么每次都必须重绘内容可能会导致严重的性能问题。

第二个选项是打开“滚动复制”,然后创建一个包含覆盖视图的无边框窗口。这实际上并不像听起来那么骇人听闻,因为您实际上可以添加一个 NSWindow 实例作为当前窗口的子窗口,以便在移动时它会自动与主窗口一起移动。

RoundTransparentWindow 示例将为您提供一个很好的示例,可以在创建包含您的叠加层的窗口时遵循。然后,只需使用 NSWindow 的 addChildWindow 将其附加到您的主窗口。

请注意,使用这种方法,您将需要处理叠加窗口的显示和隐藏时间。当您最大化父窗口时,子窗口位置似乎也不会自动调整。所以,你也必须处理它。但是,如果您不想牺牲在使用“滚动复制”时有时会带来巨大的性能改进,这是一个很好的解决方案。

【讨论】:

  • 感谢您的解决方案,同时我已经解决了这个问题。起初我也有你的解决方案,但是,正如你所说的子窗口版本有很多缺点。一种更简单的方法是将 NSScrollView 子类化并在那里添加子视图。现在我可以在覆盖的 reflectScrolledClipView 实现中调整子视图的位置,等等,效果很好:)
  • 啊,非常好的解决方案。这绝对是您用例的最佳解决方案。就我而言,我需要一个仅与滚动视图部分重叠的视图,因此我无法将其绘制在里面。我不得不改用子窗口方法。
【解决方案2】:

我知道你已经有了一个可行的解决方案,但我最近碰巧自己也在寻找同样的东西,我遇到了 Louis Klaassen 的 LKOverlayWindow 课程,它似乎为这种类型提供了一个简单的解决方案的叠加。

CocoaDev wiki 中所述,您只需要在Interface Builder 中创建一个新的NSWindow,让它成为LKOverlayWindow 的一个实例,然后通过插座附加NSScrollView 或在代码中指定它。一旦附加到滚动视图,LKOverlayWindow 的内容将覆盖滚动视图并在它移动和调整大小时跟踪它(后者似乎只与 NSScrollView 作为窗口的出口一起使用)。作者here提供了一个样例工程。

我打算采用继承 NSScrollView 的方式,但结果证明这对我来说要容易得多。

【讨论】:

  • 很不错,下次还会用。感谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多