设计问题:Core Animation,NSCollectionView和NSCollectionViewItems

时间:2011-11-24 17:35:44

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


我正在努力解决设计问题:我有NSCollectionView包含多个项目(它绑定到NSArrayController,而后者绑定到NSManagedObjectContext。我已经决定以编程方式为每个单独的项目绘制视图,主要是因为我注意到在项目视图中嵌套多个NSView会在集合视图中有超过一定数量的项目时产生性能问题。 /> 请考虑以下层次结构:NSCollectionView => NSCollectionViewItem - > NSView。 (NSCollectionView使用的默认值)。 我的自定义NSView包含多个图层,其中一些是CATextLayer个,其他图层是常规CALayer,并且只要需要,它们就会一起动画(在同一个CATransaction内)。这里的问题是每个CALayer需要显示一些数据的内容,这些数据可以通过representedObject拥有NSCollectionViewItem的{​​{1}}属性访问! 我有两个选择(可能更多,我不仅仅对建议持开放态度):
- 我将NSViewrepresentedObject复制到NSCollectionViewItem,并且在程序执行过程中保持一致。我真的不喜欢这个。
- 我在NSView中公开了CALayer,并在NSView的{​​{1}}方法中设置了内容/字符串。我更喜欢这个,因为NSCollectionViewItem中没有保存数据(当然,通过图层显示的数据除外)。
我错了吗?有更优雅的解决方案吗?

在此先感谢,我真的很感激帮助。 干杯

吉安·马可

1 个答案:

答案 0 :(得分:3)

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

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

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

NSCollectionViewItem是一个NSViewController,这意味着它应该负责管理它的视图。您可以通过使其所使用的视图层作为其模型对象的面向用户的表示形式来保持其RepresentObject属性。因此,通过使用KVO观察模型的所有必要属性,您应该有一个整洁的位置来调用有关“渲染”模型的所有视图操作。对于您是否要使用NSView API或CALayer API,您应该完全控制此漏斗。

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

我也很想听听你最终做出的选择。