Arc*_*gon 7 macos cocoa scroll nstableview
我有一个包含5列的NSTableView,每列包含nib中的库存NSTableCellView.(库存单元格有一个文本框和一个可选图像.)填充后,表格大约有50行.一切都很好,但滚动表现非常糟糕.看起来这种情况正在发生,因为每当表格滚动时,每个单元格都会获得一个drawRect:消息,表示其完整的rect.但是,reloadData和reloadDataForRowIndexes:ColumnIndexes:都没有被调用,所以不是这样.它也不是单元格的内容:我试着将我的所有代码都注释掉,只留下每个单元格的默认单元格图像和文本,性能也是一样的.滚动时,没有任何单元格更新.(我在tableView中设置了一个断点:viewForTableColumn:row:以确保.)
我的实现有以下委托方法:
而已!还不是很复杂.
我觉得我错过了一些完全明显的东西.什么可能导致这些重绘?
编辑:想想看,其他几个应用程序(uTorrent,Xcode)似乎表现出相同的慢滚动行为.如果你在滚动时查看CPU使用情况,你真的可以看到它.另一方面,活动监视器具有黄油般平滑的滚动功能,根本不会对CPU造成任何影响.我如何在我的应用程序中获得它?
编辑2:我想我发现了自己的错误.根据Apple的说法:
在iOS应用程序中,始终启用Core Animation,每个视图都由一个图层支持.在OS X中,应用必须通过执行以下操作明确启用Core Animation支持:
- 链接QuartzCore框架.(iOS应用必须仅在明确使用Core Animation接口时才链接此框架.)
通过执行以下操作之一,为一个或多个NSView对象启用图层支持:
- 在nib文件中,使用View Effects检查器为视图启用图层支持.检查器显示所选视图及其子视图的复选框.建议您尽可能在窗口的内容视图中启用图层支持.
- 对于以编程方式创建的视图,请调用视图的setWantsLayer:方法并传递值YES以指示视图应使用图层.
以上述方式之一启用图层支持会创建一个图层支持的视图.使用图层支持的视图,系统负责创建底层图层对象并保持更新该图层.在OS X中,还可以创建图层托管视图,从而您的应用程序实际创建和管理基础图层对象.(您无法在iOS中创建图层托管视图.)有关如何创建图层托管视图的详细信息,请参阅"图层托管允许您更改OS X中的图层对象".
我会在解决性能问题后立即添加答案.通过粗略的传递,我的滚动仍然颠簸,但滚动时我的CPU使用率从70%下降到10%.
根据记录...OP 的编辑 2 使世界变得不同。
\n\n\n\n在 iOS 应用程序中,核心动画始终处于启用状态,并且每个视图都由图层支持。在 OS X 中,应用程序必须通过执行以下操作显式启用核心动画支持:
\n\n链接到 QuartzCore 框架。(iOS 应用程序只有在显式使用 Core Animation 接口时才必须链接到此框架。)\n 通过执行以下操作之一启用对一个或多个 NSView 对象的层支持:
\n\n在 nib 文件中,使用视图效果检查器为视图启用图层\n 支持。检查器显示所选视图及其子视图的复选框。建议您尽可能在窗口的内容视图中启用层支持。\n 对于以编程方式创建的视图,请调用 view\xe2\x80\x99s setWantsLayer:\n 方法并传递 YES 值来指示视图应该使用层。\n 通过上述方法之一启用图层支持会创建\n 图层支持的视图。使用图层支持的视图,系统负责创建底层对象并保持该图层的更新。在 OS X 中,还可以创建层托管视图,您的应用程序可以通过该视图实际创建和管理底层对象。(您无法在 iOS 中创建图层托管视图。)有关如何创建图层托管视图的详细信息,请参阅\n \xe2\x80\x9c图层托管允许您在 OS X 中更改图层对象。\xe2\ x80\x9d
\n