我需要提高视图的滚动性能,以便在图像顶部进行注释。
目前,我有以下内容:
- annotationView (custom NSView)
- imageView (NSImageView)
- contentView (custom NSView)
- clipView (NSClipView)
- scrollView (NScrollView)
图像是相当大的PDF和PNG,除非我支持imageView图层,否则滚动效果很差,这只是我在Interface Builder中所做的。这样滚动就很流畅了。
但是,PNG图像会覆盖imageView顶部的所有内容,而PDF图像会正确保留在背景中。
这是为什么,我该如何解决?
为了获得更好的性能,我还希望同时支持annotationView层,但是如果这样做,则整个视图将变黑-除了在notationView上绘制注释之外。我如何使此后层视图透明,但仍允许在其上绘制形状。看来我可以使它透明,但随后所有东西都变得透明,包括绘制的形状。
是否有更好的方法来实现这一目标?注释只是形状和文本,需要放置在图像上的特定位置上,而我目前只是根据鼠标位置来绘制这些图像。
答案 0 :(得分:0)
简短的答案是使用支持图层的视图,并使用CGContext
进行绘制,而不是使用简单的NSView
绘制API。
与iOS不同,默认情况下,macOS不使用基于GPU的图形。
macOS提供了高级API,该API使用CPU而非GPU进行图形操作。
因此,在我的情况下,我将所有内容都切换为layer backed NSViews
-您可以在Interface Builder中进行设置,也可以在wantsLayer = true
初始化代码(NSView
中简单地添加'init()
'
避免使用NSImageView
,而是使用支持图层的视图并设置layer.content = NSIMage
,您可能还必须设置图层的背景色,或者在滚动时可能无法清除背景的某些区域
这对我有用-我的背景中有大PDF图像-建筑布局,并在该视图的上方有一个层支持的视图,用于放置注释。
现在滚动可以很顺滑。图片似乎会立即加载。
在大多数情况下,这非常容易-只需从一开始就进行设置即可,省去了很多麻烦。