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

Objective c 如何构建日历自定义控件?,objective-c,cocoa,cappuccino,objective-j,Objective C,Cocoa,Cappuccino,Objective J,​ 提要 我想构建一个在日历中显示事件的自定义控件 这是草案: 概念 左下角的框可以垂直滚动。右下角的框可以双向滚动 可以四处移动事件视图。如果在拖动过程中接近边界,视图将自动向该方向滚动 根据数据库中最早和最新的事件或某个最大值,滚动区域是有限的。但是,如果用户继续滚动,滚动区域会相应增大,如果用户向后滚动并且没有创建新事件,则滚动区域会塌陷 底部的“2011年7月”按钮用作滚动条。如果用户将其拉到滚动区域的边界之外,它将相应地增长 标题中的月份名称在下一个月移入之前始终保持在该位置,因此

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

这是草案:

概念
  • 左下角的框可以垂直滚动。右下角的框可以双向滚动
  • 可以四处移动事件视图。如果在拖动过程中接近边界,视图将自动向该方向滚动
  • 根据数据库中最早和最新的事件或某个最大值,滚动区域是有限的。但是,如果用户继续滚动,滚动区域会相应增大,如果用户向后滚动并且没有创建新事件,则滚动区域会塌陷
  • 底部的“2011年7月”按钮用作滚动条。如果用户将其拉到滚动区域的边界之外,它将相应地增长
  • 标题中的月份名称在下一个月移入之前始终保持在该位置,因此它是一个长单元格,跨越月份的日期单元格,并带有浮动标题
  • 标题行和列始终可见
问题 因为我对Cappuccino或Cocoa的控件类的功能只稍微熟悉一点:在哪里可以直接使用Cappuccino或Cocoa类,在哪里可以合理地将Cappuccino/Cocoa控件划分为子类,在哪里必须从头开始编写自定义控件

编辑:我的想法 我认为用垂直分隔符分割SplitView控件是合理的。我可以使用TableView作为左子视图中的左标题列。我可以将垂直滚动与右侧发生的同步


但我不太确定右边的景色。我考虑过TableView,但实际上我只需要单元格作为背景网格。因此,我想,拥有两个标题行并实现所需的滚动行为是很困难的。因此,最好的方法可能是创建一个全新的自定义视图。但问题又来了:将卡布奇诺resp分类在哪里是合理的。Cocoa控件以及从何处从头开始编写自定义控件?

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

然后将整个日历视图置于
CPScrollView
中。将其垂直滚动与左侧的滚动视图同步-在此处使用
CPTableView
。使用
CPScrollView
:只需在内容视图上调用
scrollToPoint:
,滚动就相当容易了。您需要动态扩展内容视图大小以允许“无限”滚动。可能只是简单地将内容视图的大小设置为其事件大小和当前滚动位置+X的最小值(X为用户提供一定的滚动距离,然后再调整大小)

简而言之,当没有交互时,子类
CPView
CPControl
-
CPView
,当有交互时,子类
CPControl