我有一个有 5 列的 NSTableView,每列在笔尖中都包含一个股票 NSTableCellView。(库存单元格有一个文本框和一个可选图像。)填充后,表格大约有 50 行。一切都很好,但滚动性能很差。看起来这种情况正在发生,因为每当表格滚动时,每个单元格都会收到一个完整矩形的 drawRect: 消息。但是, reloadData 和 reloadDataForRowIndexes:ColumnIndexes: 都没有被调用,所以不是这样。这也不是单元格的内容:我尝试注释掉我的所有代码,只为每个单元格保留默认的单元格图像和文本,并且性能是相同的。滚动时,没有一个单元格得到更新。(我在 tableView:viewForTableColumn:row: 中放了一个断点以确保。)
我的实现具有以下委托方法:
- tableView:viewForTableColumn:row: 在委托中;这会通过 makeViewWithIdentifier:owner 创建和填充新单元格:
- numberOfRowsInTableView:在数据源中;这将返回一个常数
- tableView:sortDescriptorsDidChange: 在数据源中
而已!不是很复杂,但是。
我觉得我错过了一些完全明显的东西。什么可能导致这些重绘?
编辑:想想看,其他几个应用程序(uTorrent、Xcode)似乎表现出同样的缓慢滚动行为。如果您在滚动时查看 CPU 使用率,您可以真正看到它。另一方面,Activity Monitor 的滚动非常流畅,几乎不会占用 CPU。我如何在我的应用程序中获得它?
编辑2:我想我发现了我的错误。根据苹果:
在 iOS 应用程序中,Core Animation 始终处于启用状态,并且每个视图都由一个层支持。在 OS X 中,应用程序必须通过执行以下操作显式启用 Core Animation 支持:
- 链接到 QuartzCore 框架。(iOS 应用只有在明确使用 Core Animation 接口时才必须链接到这个框架。)
通过执行以下操作之一为一个或多个 NSView 对象启用层支持:
- 在您的 nib 文件中,使用 View Effects 检查器为您的视图启用图层支持。检查器显示选定视图及其子视图的复选框。建议您尽可能在窗口的内容视图中启用图层支持。
- 对于以编程方式创建的视图,调用视图的 setWantsLayer: 方法并传递一个值 YES 以指示视图应该使用层。
以上述方式之一启用层支持会创建一个支持层的视图。对于支持层的视图,系统负责创建底层对象并保持该层更新。在 OS X 中,还可以创建一个层托管视图,您的应用程序实际上可以创建和管理底层的层对象。(您不能在 iOS 中创建 layer-hosting 视图。)有关如何创建 layer-hosting 视图的更多信息,请参阅“Layer Hosting 让您在 OS X 中更改图层对象。”</p>
解决性能问题后,我会立即添加答案。粗略地通过,我的滚动仍然颠簸,但滚动时我的 CPU 使用率从 70% 下降到 10%。