【问题标题】:Design issue: Core Animation, NSCollectionView and NSCollectionViewItems设计问题:核心动画、NSCollectionView 和 NSCollectionViewItems
【发布时间】:2011-11-24 17:35:43
【问题描述】:


我正在努力解决一个设计问题:我有一个包含多个项目的NSCollectionView(它绑定到NSArrayController,而NSArrayController 又绑定到NSManagedObjectContext)。我决定以编程方式为每个项目绘制视图,主要是因为我注意到当集合视图中有超过一定数量的项目时,在项目视图中嵌套多个 NSViews 会产生性能问题。
考虑以下层次结构:NSCollectionView => NSCollectionViewItem -> NSView。 (NSCollectionView 使用的默认值)。 我的自定义NSView 包含多个图层,一些是CATextLayers,另一些是常规CALayers,并且它们都在需要时一起动画(在同一个CATransaction 内)。这里的问题是每个CALayer 需要显示一些数据的内容,这些数据可以通过NSCollectionViewItem... 的representedObject 属性访问,它拥有NSView! 我有两个选择(可能更多,我非常愿意接受建议):
- 我将representedObjectNSCollectionViewItem 复制到它的NSView,并在程序执行过程中保持一致。我不是很喜欢这个。
- 我在NSView 中公开CALayers,并从NSCollectionViewItemsetRepresentedObject: 方法中设置它们的内容/字符串。我更喜欢这个,因为NSView 中没有保存数据(当然,通过图层显示的数据除外)。
我错了吗?有没有更优雅的解决方案?

提前感谢,我真的很感激帮助。 干杯

吉安·马可

【问题讨论】:

  • 一个非常好的问题,我猜很少有人知道正确的答案。一个问题..你在哪里设置你的CALayer?我正在尝试做同样的事情,并且在我将之前的 View 托管元素添加到 NSArrayController 之前尝试这样做时感觉有点愚蠢。 NSViewCALayer 之间的心理差距是巨大的,尽管我确实认为苹果公司保持动画 API 非常简单。

标签: objective-c macos core-animation calayer nscollectionview


【解决方案1】:

很晚才发现这个问题,我认为这是一个有趣的设计问题。

如果你还没有破解这个或者不喜欢你的任何一个解决方案:

我建议编写一个 NSCollectionViewItem 子类来观察 self.representedObject 键路径,并在模型对象更改时刷新其视图和子视图。

NSCollectionViewItem 是一个 NSViewController,这意味着它应该负责管理它的视图。您可以通过将其工作的视图层作为其模型对象的面向用户的表示形式保存在其代表对象属性中来尊重这一点。因此,通过使用 KVO 查看模型的所有必要属性,您应该有一个整洁的位置来调用与“渲染”模型有关的所有视图操作。您应该在此漏斗中完全控制您是想使用 NSView API 还是 CALayer API。

根据您的原型项目视图的复杂程度、项目集的大小和波动性、UI 的“活力”要求以及其他因素,您可能能够通过非常粗略的观察来逃避模型,或者需要一个非常细粒度的模型 - 我希望您习惯使用 KVO API!

我也很想知道你最后做了什么选择。

【讨论】:

  • 嗯,您提出的解决方案确实很有趣。当时我从未使用过 KVO,但我认为它可能是一个优雅的解决方案,比我提出的要多得多。最后,无论如何我都做错了,因为我真的不需要一个 NScollectionView,只需要一个带有自定义单元格的 NSTableView。基本上,我是在重新发明轮子,这从来都不是好事。 :)
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多