如何构建日历自定义控件?

时间:2011-08-24 22:00:54

标签: objective-c cocoa cappuccino objective-j

概要

我想构建一个在日历中显示事件的自定义控件。

这是草案:

enter image description here

概念

  • 左下方框可垂直滚动。右下方框可以双向滚动。
  • 可以移动事件视图。如果它们在拖动视图时靠近边界,则会自动向该方向滚动。
  • 根据数据库中最早和最晚的事件或某个最大值,滚动区域是有限的。但是,如果用户继续滚动,滚动区域会相应增长,如果用户向后滚动并且没有创建新事件,则会折叠。
  • 底部的“2011年7月”按钮充当滚动条。如果用户将其拉出滚动区域的边界,则会相应增长。
  • 标题中的月份名称始终保持在此位置,直到下个月进入,因此它是一个长单元格,跨越当月的单元格并带有浮动标题。
  • 标题行和列始终可见。

问题

因为我只是略微熟悉Cappuccino或Cocoa的控件类的功能:我在哪里可以直接使用Cappuccino或Cocoa类,哪里可以合理地继承Cappuccino / Cocoa控件以及我在哪里编写自定义从头开始控制?

编辑:我的想法

我认为将控件与带有垂直分隔符的SplitView分开是合理的。我可以在左侧子视图中使用TableView作为左侧标题列。我可以将垂直滚动与右侧发生的事情同步。

但我对右侧的观点不太确定。我想过TableView但实际上我只需要将单元格作为背景网格。因此,我猜,要有两个标题行并实现所需的滚动行为是很困难的。因此,最好的方法可能是创建一个全新的自定义视图。但接下来的问题是:将Cappuccino子类化为何处是合理的。 Cocoa控件以及从哪里开始编写自定义控件?

1 个答案:

答案 0 :(得分:2)

对于日历视图,它看起来与表视图有很大不同,从头开始编写它可能更容易。也许从裸CPView开始并在其drawRect:方法中绘制背景,然后为事件创建CPControl子类。在其drawRect中渲染其边框和背景,或使用CPBoxsetBackgroundColor:。最好使用标签子视图绘制文本。对mouseDown做出反应,以实现拖放,双击事件以及您可能想要的其他内容。

然后将整个日历视图放在CPScrollView中。将其垂直滚动与左侧的滚动视图同步 - 在那里使用CPTableView。使用CPScrollView滚动非常简单:只需在内容视图中调用scrollToPoint:即可。您需要动态扩展内容视图大小以允许“无限”滚动。也许只是总是使内容视图大小最小化其事件的大小和当前滚动位置+ X(X给用户一些距离以便在您再次调整大小之前滚动)。

简而言之,子类CPViewCPControl - CPView在没有互动时,CPControl在没有互动时。