gpt4 book ai didi

cocoa - 将 NSView 覆盖在 NSScrollView 上

转载 作者:行者123 更新时间:2023-12-03 16:05:15 31 4
gpt4 key购买 nike

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

我尝试过以下方法:

  1. 创建一个与我的窗口大小相同的 NSView 实例
  2. 添加 NSScrollView 作为先前生成的 NSView 的 subview
  3. 将我的自定义 View 作为 subview 添加到第 1 步中的 NSView

这在开始时有效, ScrollView 和我的自定义 NSView 都正确显示。但是,一旦我开始移动 ScrollView (滚动),自定义 NSView 就会与 NSScrollView 的内容一起滚动,并最终在其移出边界时消失,并且 ScrollView 所在的部分会被重绘。如何有效地将自定义 NSView 放置在 NSScrollView 之上并确保其保持原状?

谢谢!

最佳答案

您有两个选择:

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

但是,如果您在 ScrollView 中进行复杂的绘制,则每次都必须重新绘制内容可能会导致严重的性能问题。

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

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

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

关于cocoa - 将 NSView 覆盖在 NSScrollView 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4723199/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com