3

​</p>

概要

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

这是草稿:

在此处输入图像描述

这个概念

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

问题

因为我对 Cappuccino 或 Cocoa 的控件类的功能只是稍微熟悉:我在哪里可以直接使用 Cappuccino 或 Cocoa 类,在哪里子类化 Cappuccino/Cocoa 控件是合理的,我在哪里必须从头开始编写自定义控件?

编辑:我的想法

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

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

4

1 回答 1

2

对于日历视图,它看起来与表格视图有很大不同,因此从头开始编写它可能更容易。或许从一个bare 开始CPView并在它的drawRect: 方法中绘制背景,然后CPControl为事件创建一个子类。在它的 drawRect 中渲染它的边框和背景,或者使用CPBoxwith setBackgroundColor:。文本最好用标签子视图绘制。React tomouseDown等以实现拖放、双击事件以及您可能想要的其他内容。

然后将整个日历视图放在一个CPScrollView. 将其垂直滚动与左侧的滚动视图同步 - 使用CPTableView那里。滚动是相当容易的CPScrollView:只需调用scrollToPoint:内容视图。您将需要动态扩展内容视图大小以允许“无限”滚动。也许只是总是让内容视图大小成为其事件大小和当前滚动位置 + X 的最小值(X 给用户一些滚动距离,然后您必须再次调整大小)。

简而言之,子类CPViewCPControl-CPView什么时候没有交互,CPControl什么时候有。

于 2011-08-25T14:29:05.763 回答