首页 > 解决方案 > 优化 NSImageView 和 NSView 滚动性能的正确方法是什么

问题描述

我需要提高视图的滚动性能,以便在图像顶部进行注释。

目前我有以下内容:

- annotationView (custom NSView)
- imageView (NSImageView)
- contentView (custom NSView)
- clipView (NSClipView)
- scrollView (NScrollView)

这些图像是相当大的 PDF 和 PNG,除非我支持 imageView 层,否则滚动效果很差,我只是在 Interface Builder 中这样做。然后滚动非常流畅。

然而,PNG 图像覆盖了 imageView 之上的所有内容,而 PDF 图像正确地保留在背景中。

为什么会这样,我该如何解决?

为了获得更好的性能,我还想支持 annotationView 层,但如果我这样做,整个视图都会变黑 - 除了在 annotationView 上绘制的注释。如何使该图层支持的视图透明但仍允许在其上绘制形状。似乎我可以让它透明,但随后一切都变得透明,包括绘制的形状。

有没有更好的方法来实现这一目标?注释只是需要放置在图像上特定位置的形状和文本,我目前只是根据鼠标位置进行绘制。

标签: macoscalayernsview

解决方案


简短的回答是使用图层支持的视图并CGContext用于绘图,而不是更简单的NSView绘图 API。

默认情况下,macOS 不使用基于 GPU 的图形,这与 iOS 不同。

macOS 提供了一个高级 API,它使用 CPU 而不是 GPU 进行图形操作。

因此,在我的情况下,我将所有内容都切换为layer backed NSViews- 您可以在 Interface Builder 中设置它,或者只需wantsLayer = trueNSView初始化代码 ( init()) 中添加 ' '。

避免使用NSImageView,而是使用图层支持的视图并设置layer.content = NSIMage,您可能还必须设置图层背景颜色,否则您可能会在滚动时获得一些背景区域未清除。

这对我有用 - 我在背景中有大的 PDF 图像 - 构建布局和一个图层支持的视图,用于放置注释。

滚动现在非常流畅。图像似乎立即加载。

在大多数情况下,它非常容易 - 只需从一开始就设置好,省去很多麻烦。


推荐阅读