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

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐