1.简介:
一款简单好用的第三方日历开源组件.
2.安装:
参考:https://github.com/CVCalendar/CVCalendar
根据上一篇博文,使用cocoaPod安装:
pod 'CVCalendar', '~> 1.6.1'
注意,在github的介绍上分为storyboard加载和手动加载.但是经过我的试验,不知道为什么通过storyboard加载,日历部分会加载不成功.所以,这次还是采用手动加载.
就是在storyboard里面弄连个UIView,一个准备加载CVCalendarMenuView,另一个加载CVCalendarView.但是我们不在storyboard上面给两个view定义类.
在controller里:
声明
var viewCalendarMenu: CVCalendarMenuView!
var viewCalendar: CVCalendarView!
新建一个function,初始化两个Calendar类:
func initCalendar()->Void{
/*
* 在页面顶端显示当前的日期
*/
let currentCalendar:Calendar = Calendar.init(identifier: .gregorian)
dateLabel.text = CVDate(date: Date(), calendar: currentCalendar).commonDescription
/*
* 初始化日历菜单
*/
viewCalendarMenu = CVCalendarMenuView(frame: CGRect(x:menuView.bounds.origin.x,y:menuView.bounds.origin.y, width:menuView.bounds.size.width, height:menuView.bounds.size.height))
/*
* 初始化日历
*/
viewCalendar = CVCalendarView(frame: CGRect(x:calendarView.bounds.origin.x, y:calendarView.bounds.origin.y, width:calendarView.bounds.size.width, height:calendarView.bounds.size.height))
/*
* 为日历菜单注册代理
*/
viewCalendarMenu.menuViewDelegate = self
/*
* 为日历注册代理
*/
viewCalendar.calendarDelegate = self
/*
* 将日历组件放在界面上
*/
menuView.addSubview(viewCalendarMenu)
calendarView.addSubview(viewCalendar)
}
还有必须要加入:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
viewCalendarMenu.commitMenuViewUpdate()
viewCalendar.commitCalendarViewUpdate()
}
最后继承delegate:
extension BookDateViewController: CVCalendarViewDelegate,CVCalendarMenuViewDelegate{
func presentationMode() -> CalendarMode {
return .monthView
}
func firstWeekday() -> Weekday {
return .monday
}
func presentedDateUpdated(_ date: CVDate) {
//导航栏显示当前日历的年月
dateLabel.text = date.globalDescription
}
//每个日期上面是否添加横线(连在一起就形成每行的分隔线)
func topMarker(shouldDisplayOnDayView dayView: CVCalendarDayView) -> Bool {
return true
}
func dotMarker(shouldShowOnDayView dayView: DayView) -> Bool {
if !dayView.isHidden && dayView.date != nil {
//获取该日期视图的年月日
let year = dayView.date.year
let month = dayView.date.month
let day = dayView.date.day
let calendar = NSCalendar.current
var comps: DateComponents = DateComponents()
comps = calendar.dateComponents([.year,.month,.day], from: Date())
//判断日期是否符合要求
if year == comps.year && month == comps.month && day == comps.day {
return true
}
}
return false
}
func dotMarker(colorOnDayView dayView: DayView) -> [UIColor] {
return [UIColor.lightGray]
}
func dotMarker(moveOffsetOnDayView dayView: DayView) -> CGFloat {
return 10
}
//日期选择响应
func didSelectDayView(_ dayView: CVCalendarDayView, animationDidFinish: Bool) {
//获取日期
let date = dayView.date.convertedDate()!
// 创建一个日期格式器
let dformatter = DateFormatter()
dformatter.dateFormat = "yyyy年MM月dd日"
let message = "当前选择的日期是:\(dformatter.string(from: date))"
//将选择的日期弹出显示
let alertController = UIAlertController(title: "", message: message,preferredStyle: .alert)
let okAction = UIAlertAction(title: "确定", style: .cancel, handler: nil)
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
}
}
可以看到delegate里面就有calendar类的各种API可以调用.可以自定义分割线,灰点,点击事件等等.
有些再深入一些的UI修改可能就需要修改源码了,例如分割线的颜色,灰点的初始位置等等,API都没给出接口.
一些用法可以参考:http://www.hangge.com/blog/cache/detail_1504.html