macos - 基于 NSTableview View 的滚动性能

标签 macos cocoa swift scroll nstableview

我对 OS X Cocoa 编程还很陌生,但我决定尝试使用新的 Swift 语言。

我有一个 NSTableView 有 1500 行(会更多)和 7 列。有一个复选框列,其余为文本字段,一个带有日期格式,一个带有货币格式。我首先将其设置为基于单元格。滚动非常顺畅(我什至做了一个添加 100 万行的测试,仍然顺畅)。这是在特立独行的情况下。

然后我升级到 Yosemite,滚动性能显着下降。在表格 View 上启用核心动画层复选框改善了这一点,但仍然比特立独行者差。

在我尝试提高优胜美地滚动性能的阅读过程中,我遇到了“基于 View ”的 NSTableViews。从文档中可以看出,通常不应使用基于单元格的 TableView ,并且仅支持遗留项目。

因此,我将表格转换为基于 View 的表格 View 。示例简单的概念,没有什么复杂的。滚动性能绝对糟糕。如果你滚动得非常慢,它就足够平滑了,但是一旦你开始滚动得更快,它就好像它没有足够的缓冲,它开始断断续续和抽搐。此外,当 NSTableview 被填充时,聚焦和散焦窗口需要一秒钟或更长时间(我再次在 mavericks 中尝试它并且不存在,滚动也好一点,但仍然离基于单元格还差得很远).

基于 View 的 NSTableviews 是否总是对滚动性能不利?如果是这样,为什么 Apple 推荐使用它们而不是基于单元格的 NSTableviews

还有一些应用程序,如 safari 和 Reeder2,即使在 Yosemite 中也有黄油般平滑的滚动。他们是如何做到这一点的?

我是不是遗漏了什么,或者 OS X 的性能是否因为每个新事物而变得糟糕?即

Mavericks > Yosemite

Cell-Based > View-Based

Old > New

非常感谢任何帮助。谢谢!

最佳答案

根据 Apple 的说法,OSX 从不默认启用 QuartzCore(而 iOS 则启用)。因此,您需要:

  • 在“build设置” Pane 下链接到 QuartzCore.framework 您的项目。
  • 为您的主窗口启用 CoreAnimation Layer(在 IB 上的 View Effects Inspector 下)(如果可能,请务必在容器 View 上启用它,这会导致性能不佳)。

引用 Apple 文档:

In iOS apps, Core Animation is always enabled and every view is backed by a layer. In OS X, apps must explicitly enable Core Animation support by doing the following:

Link against the QuartzCore framework. (iOS apps must link against this framework only if they use Core Animation interfaces explicitly.) Enable layer support for one or more of your NSView objects by doing one of the following:

In your nib files, use the View Effects inspector to enable layer support for your views. The inspector displays checkboxes for the selected view and its subviews. It is recommended that you enable layer support in the content view of your window whenever possible. For views you create programmatically, call the view’s setWantsLayer: method and pass a value of YES to indicate that the view should use layers. Enabling layer support in one of the preceding ways creates a layer-backed view. With a layer-backed view, the system takes responsibility for creating the underlying layer object and for keeping that layer updated. In OS X, it is also possible to create a layer-hosting view, whereby your app actually creates and manages the underlying layer object. (You cannot create layer-hosting views in iOS.) For more information on how to create a layer-hosting view, see “Layer Hosting Lets You Change the Layer Object in OS X.”

更多信息:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/SettingUpLayerObjects/SettingUpLayerObjects.html

关于macos - 基于 NSTableview View 的滚动性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26696644/

相关文章:

macos - 有没有办法确定 CGLFlushDrawable 对后台缓冲区做了什么?

macos - glutPassiveMotionFunc和glutWarpMousePointer

objective-c - AVCaptureScreenInput 和 kCGWindowListOptionOnScreenBelowWindow

macos - 无法在 NSView 中正确定位 NSImageView

ios - 在表格 View 中滚动后,选中标记会更改

c++ - 以错误大小呈现的 SFML 窗口

objective-c - initWithContentRect 和 setContentView 中的内存泄漏

objective-c - 创建文件模板?

ios - 最后听到的歌曲( swift )

arrays - Swift 无法使用类型为 'find' 的参数列表调用 '([Score], Score)',其中 Score 是一个结构