Cocoa - 高效 View 绘制

标签 cocoa macos nsview

在我的程序中,我正在实现一个自定义 View ,有点像表格 View 。为此,我对 NSView 进行了子类化。现在我的问题是,绘制所有 TableView 单元格的最有效方法是什么。我应该只使用 NSViews 还是其他东西,比如 CALayers?

谢谢!

P.S.:这是在 Mac OS X 上,不是在 iOS 上。

最佳答案

根据您的问题和评论,我提出两种替代方案:

NSCollectionView/NSCollectionViewItem - 仅当所有“单元”(原型(prototype) View 的实例)尺寸相同时,这才有用。也就是说,你不能拥有比其他更宽或更高(或者更窄或更短)的一个。这是高效并且是AppKit 的现成部分。即使只有一列和 n 行,它也能发挥作用。

自己动手 - 这比较难,但可以为您提供灵 active 。与 NSCollectionView/NSCollectionViewItem 非常相似,您将有一个充当容器的 View ,并且理想情况下您将有一个可重用的 View 来绘制它所显示的各种“项目”。使用相同的 View 来设置其表示的对象并将其“标记”到位(摆出姿势并绘制它),您可以一次性浏览整个集合,然后使用与实时、事件 View 相同的 View 来处理任何选定的、聚焦的内容你拥有的元素。甚至更快:使用可重用项目 View 滚动并缓存每个项目的图像和大小,并从缓存中绘制除所选项目之外的所有项目(这将使用位于正确位置的实时真实 View ,更新其自身的缓存图像因为它的内容在未选择时会发生变化)。更快:1 个实时 View 和 1 个“用于缓存” View ,并且仅绘制与可见矩形相交的缓存图像的计算矩形(无“实时”/选定 View )。注意:每次容器框架的宽度发生变化时,都必须重新进行缓存,因为水平缩小可能意味着所有项目都会垂直增长。如果可以的话,利用 NSOperation/NSOperationQueue 来处理后台缓存,仅当所有缓存项为 0 - n(其中 n 是与可见矩形相交的最高索引项)可用。

我在自己的一个应用程序中使用了与后者非常接近的东西,其中“项目”是具有不同长度文本的条目。我没有采用我自己的解决方案中提到的所有策略,但大多数策略,并且性能的提高非常令人满意。 :-)

希望这有帮助。

关于Cocoa - 高效 View 绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4721875/

相关文章:

macos - Mac OS X/iOS : How to write indexed PNG image using RGBA colours through CGImage?

c++ - XCode 项目是否需要特殊设置才能使用预编译的 boost 库?

macos - 我可以在 OSX 中使用 iOS 的本地推送通知吗

objective-c - 要链接哪个 OSX 库(命令行)以使用 NSLog?

macos - 如何在图层主机 NSView 中使用 NSVisualEffectView

swift - 在 NSView 中使用 CALayer 制作线条动画

swift - NSOpenPanel继承和 "designated initializer"

iphone - Cocoa:使用 NSNotification 和 NSDictionary 传递 CGPoint 时出现问题

ios - 我如何从 viewController 中提取死元素

objective-c - 是否可以观察 -visibleRect