概览
屏幕截图
GIF 演示
安装
CocoaPods
pod 'CVCalendar', '~> 1.6.2'
用法
使用CVCalendar并不困难。有几种方法来实现它:
- 故事板设置
- 手动设置
那么,让我们开始吧。
注意!从1.1.1版本开始,CVCalendar需要实现两个协议CVCalendarViewDelegate和CVCalendarMenuViewDelegate,请实现两个都。请注意,它们都有一个相同签名的函数,这意味着你只需要实现一次。有关更多信息,请查看示例项目。
故事板设置
基本设置。
首先,您必须通过CocoaPods
将CVCalendar
集成到您的项目中。
现在,您需要像下面的图片所示,将2个UIView添加到您的Storyboard中。
别忘了在代码中添加2个出口。
@IBOutlet weak var menuView: CVCalendarMenuView!
@IBOutlet weak var calendarView: CVCalendarView!
这两个视图最终表示MenuView和CalendarView,因此它们应该有对应的类。要更改它们的类,请转到身份检查器并设置自定义类。完成后,您将在坞面板中看到类似下面的内容。(蓝色UIView -> CVCalendarView,绿色UIView -> CVCalendarMenuView)
注意:请注意,CalendarView和MenuView都会根据它们自己的来计算内容的边框。因此,在您的项目中,您可能需要编辑Storyboard中初始UIView的大小,以达到最佳的内容大小。
在我们设置用于定制的代理之前,你应该知道CalendarView的初始化分为两个部分:* On Init. * On Layout。 重要提示。
正如大多数开发者在开始初始化时使用AutoLayout功能,UIView的大小不一定与出现时的视图大小一致。因此,我们有两种选择:在UIView出现时初始化ContentView和MonthView以及所有适当的组件,或者在UIView初始化时初始化这些组件,然后简单地更新框架。第一种方法不适用,因为会有闪动效果(初始化将在你的UIView出现后完成),这是CVCalendar有两部分创建造成的。
由于CVCalendarView和CVCalendarMenuView将被自动创建,你只需要做以下操作(在包含CVCalendar的ViewController中)。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
menuView.commitMenuViewUpdate()
calendarView.commitCalendarViewUpdate()
}
代理设置(定制)。
CVCalendar需要实现两个协议。它们是CVCalendarViewDelegate和CVCalendarMenuViewDelegate。请注意,后者的方法名与前者声明的方法完全相同,这意味着你只需要在CVCalendarViewDelegate中实现所需的方法,并将你的控制器设置为实现了这两个协议的代理。
这些协议表示获取构建CVCalendarView和CVCalendarMenuView所需的数据。因此,不要忘记实现它们。
简而言之,可定制的属性
- 显示工作日
- 在突出显示时移动点标记
- 在特定日期视图中显示点标记
- 点标记的颜色、偏移量和大小
- 周视图和日视图之间的空间
- 日视图的标签属性(颜色、背景、透明度+不同状态(正常/突出显示))
行为
- 日视图选择
- 展示日期更新
- 在(取消)选择日视图时的动画
最后我们将自定义属性。为了使这成为可能,你必须实现适当的协议。(你可以在架构部分中查看展示的协议和简短描述)。打开你的Storyboard,右键单击CVCalendarView,你将看到一个带有出口的窗口,这里有一些我们实际上需要的。查看图片以确保你做的一切都正确。
现在,根据你想要更改的内容,你应该实现一个特定的协议,提供自定义这些内容的所需方法。有关代理的API描述,请参阅[此页面](https://github.com/CVCalendar/CVCalendar/wiki)。
如果你实现协议,请务必将特定的出口连接到你的ViewController。
注意:CVCalendar为所有可定制属性(即定义在展示的协议中)定义了默认值。到目前为止,如果你没有实现自己的协议,日历将按照最初的设计运行。
手动设置
如果你出于某种原因想要手动设置CVCalendar,你必须执行以下步骤。
使用 init
或 init:frame
方法初始化 CVCalendarView。建议在 viewDidLoad
方法中完成初始化。不要在 viewDidAppear:
或 viewWillAppear:
方法中进行初始化!然后设置委托以自定义选项。
请注意,应先设置 CVCalendarAppearanceDelegate,然后设置 CVCalendarViewDelegate,以确保您的更改能够应用。
对于 CVCalendarMenuView,您可以像初始化 CVCalendarView 一样初始化它,并且需要实现 CVCalendarMenuViewDelegate 协议。
它看起来应该是这样的。
override func viewDidLoad() {
super.viewDidLoad()
// CVCalendarMenuView initialization with frame
self.menuView = CVCalendarMenuView(frame: CGRectMake(0, 0, 300, 15))
// CVCalendarView initialization with frame
self.calendarView = CVCalendarView(frame: CGRectMake(0, 20, 300, 450))
// Appearance delegate [Unnecessary]
self.calendarView.calendarAppearanceDelegate = self
// Animator delegate [Unnecessary]
self.calendarView.animatorDelegate = self
// Menu delegate [Required]
self.menuView.menuViewDelegate = self
// Calendar delegate [Required]
self.calendarView.calendarDelegate = self
}
不要忘记在 viewDidLayoutSubviews
方法上提交更新。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Commit frames' updates
self.menuView.commitMenuViewUpdate()
self.calendarView.commitCalendarViewUpdate()
}
就这样。
架构
版本矩阵
虽然 CVCalendar 采用最新的 Swift 语言语法,但修订版本如下所示:
CVCalendar | Swift | Xcode | 发布说明 |
---|---|---|---|
1.6 | 4.x | 8.x, 9.x, 10.x | HEAD |
1.5 | 3.x | 8.x, 9.x | swift3-branch |
1.4 | 3.x | 7.x, 8.0 | 不受支持 |
1.3 | 2.x | 7.x | 不受支持 |
1.2 | 1.x | 7.x | 不受支持 |
高级 API
面向贡献者
如果您有任何评论,请随时打开一个问题或提交 PR。请确保在执行此操作时遵守提供的 issue 模板。此外,请注意,演示项目旨在测试 CVCalendar 的更改。如果您已提交,请不要忘记检查是否一切正常且按预期工作,并相应地更新文档。谢谢