帮助Cocoa:对象作为视图?

时间:2010-02-24 12:11:05

标签: cocoa macos views mouseevent

在我的应用程序中,我希望有一个光桌来分类照片。基本上它只是一个巨大的视图,里面有很多照片,你可以拖动照片。照片可以重叠,它们不会像iPhoto一样落入网格中。

所以每张照片都需要响应鼠标事件。我是否将每张照片都放在自己的视野中?或者视图太昂贵而无法创建?我想轻松支持100多张照片或更多。

照片也需要分层,所以我可以更改堆叠顺序。我是否使用CoreAnimation?

我不需要完成源代码只是一些指针和一般想法。我会(尝试)自己弄清楚实施。

Fwiw,我的目标是10.5+,我使用Obj-C 2.0和垃圾收集。

提前致谢!

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用NSImageViews。您可以创建一个可以轻松拖动缩放和旋转的子类。更复杂但视觉上更优越的选择是使用核心动画层(CALayer)。

只要您将照片表示保持为不同的对象(因此您可以单独操作),无论您如何表示它们,它们都将使用相当大的一块内存。如果您提供照片中的所有可用数据,则每个可能需要几个megs。您可能希望实际降低图像的显示质量,即像素大小,保真度等,除非详细处理特定照片。

请记住,您不必将照片视为他们模仿的物体。您只需在界面中创建物理对象的幻觉。我们是剧院舞台设计师,而不是建筑师。只要您的数据模型模型对于手头的任务保持严格,界面就可以参与各种幻想以造福用户。

答案 1 :(得分:2)

你绝对应该使用CALayer个对象。使用一组NSImageView子视图很快会在性能方面变得无法管理,特别是如果屏幕上有超过100个图像。如果您出于某种原因不想使用Core Animation,那么创建单个自定义视图并自行处理所有图像绘制和命中测试会更好。这比实例化许多NSImageView个对象更有效。

然而,核心动画层将通过这种方法提高性能数量级,因为每层都在GPU中进行缓冲,因此您可以以几乎零成本的方式拖动图层,而您只需要绘制一次图像而不是每次视图中的任何内容都会发生变化。核心动画也将为您处理图层堆叠。

查看优秀的CocoaSlides示例代码,它演示了与您描述的内容非常相似的应用程序,包括命中测试和简单动画。