【问题标题】:How to Build a Calendar Custom Control?如何构建日历自定义控件?
【发布时间】:2011-11-03 05:08:37
【问题描述】:

概要

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

这是草稿:

概念

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

问题

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

编辑:我的想法

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

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

【问题讨论】:

    标签: objective-c cocoa cappuccino objective-j


    【解决方案1】:

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

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

    简而言之,子类 CPViewCPControl - CPView(如果没有交互),CPControl(如果有交互)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多