今天在網上看到一個比較簡單好用的日曆組件,重要的是它是基於swift的。
官方地址在這裏:CVCalendar
其實官方開發人員在產品的首頁上已經把如何使用寫得非常清楚了。而我在使用過程中,也參考了一個國內的博主:
http://blog.csdn.net/mo_xiao_mo/article/details/53991496
這位博主也整理得十分清楚。
一、準備工作
1、首先從官方團隊的GitHub首頁上將項目下載下來:
2、將工程文件CVCalendar.xcodeproj直接拖動到工程當中去:
3、在xcode中的左側項目結構目錄中,選中你的工程名稱,在中部切換到General視圖,然後找到“Embeded Binaries”項,在該項中添加“CVCalendar.framework”:
二、代碼實現
import CVCalendar
2、繼承兩個代理:class CVCalendarViewController: UIViewController{
//...
}
extension CVCalendarViewController: CVCalendarViewDelegate,CVCalendarMenuViewDelegate {
//...
}
3、定義兩個UIView,分別用來顯示日曆上方的菜單欄(用以顯示週一到週日)以及日曆本身:var viewCalendarMenu: CVCalendarMenuView!
var viewCalendar: CVCalendarView!
4、初始化這兩個UIView:/*
* 初始化日曆菜單
*/
self.viewCalendarMenu = CVCalendarMenuView(frame: CGRect(x:0,y:60, width:300, height:135))
/*
* 初始化日曆
*/
self.viewCalendar = CVCalendarView(frame: CGRect(x:0, y:143, width:300, height:450))
5、爲這兩個UIView註冊代理:/*
* 爲日曆菜單註冊代理
*/
self.viewCalendarMenu.menuViewDelegate = self
/*
* 爲日曆註冊代理
*/
self.viewCalendar.calendarDelegate = self
6、將日曆組件放置到界面上:/*
* 將日曆組件放在界面上
*/
self.view.addSubview(self.viewCalendarMenu)
self.view.addSubview(self.viewCalendar)
7、最關鍵的一步,你需要重寫以下這個方法,用來刷新日曆組件,否則日曆無法顯示在界面上:override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.viewCalendarMenu.commitMenuViewUpdate()
self.viewCalendar.commitCalendarViewUpdate()
}
我把上面這些步驟封裝在了一個方法中,這樣只需要在viewDidLoad中調用這個方法就可以了:
var viewCalendarMenu: CVCalendarMenuView!
var viewCalendar: CVCalendarView!
override func viewDidLoad() {
super.viewDidLoad()
/*
* 初始化日曆組件
*/
self.initCalendar()
}
/**
* 初始化日曆組件
*/
func initCalendar()->Void{
/*
* 在頁面頂端顯示當前的日期
*/
let currentCalendar:Calendar = Calendar.init(identifier: .gregorian)
self.title = CVDate(date: Date(), calendar: currentCalendar).globalDescription
/*
* 初始化日曆菜單
*/
self.viewCalendarMenu = CVCalendarMenuView(frame: CGRect(x:0,y:60, width:300, height:135))
/*
* 初始化日曆
*/
self.viewCalendar = CVCalendarView(frame: CGRect(x:0, y:143, width:300, height:450))
/*
* 爲日曆菜單註冊代理
*/
self.viewCalendarMenu.menuViewDelegate = self
/*
* 爲日曆註冊代理
*/
self.viewCalendar.calendarDelegate = self
/*
* 將日曆組件放在界面上
*/
self.view.addSubview(self.viewCalendarMenu)
self.view.addSubview(self.viewCalendar)
}
三、擴展
其實這個第三方組件還提供了一些比較方便好用的高級擴展,關於這一點也可以查看官方團隊給出的說明:1、設置一週的第一天
func firstWeekday() -> Weekday {
return .Sunday
}
2、跳轉月份@IBAction func todayMonthView() {
self.calendarView.toggleCurrentDayView()
}
第二個方法用來直接跳到一個指定月份,注意入參並不是直接表示月份數,而是表示希望跳轉到的月份與當月之間相差多少個月:func toggleMonthViewWithMonthOffset(offset: Int) {
let calendar = NSCalendar.currentCalendar()
let calendarManager = CVCalendarManager.sharedManager
let components = calendarManager.componentsForDate(NSDate()) // from today
components.month += offset
components.day = 1 // CVCalendar will select this day view
let resultDate = calendar.dateFromComponents(components)!
self.calendarView.toggleMonthViewWithDate(resultDate)
}
3、往前或往後一個月:self.calendarView.loadNextMonthView()
self.calendarView.loadPreviousMonthView()
4、顯示不屬於當前月份的日期:self.viewCalendar!.changeDaysOutShowingState(shouldShow: true)
5、動態切換日曆的顯示模式:calendarView.changeMode(.WeekView)
切換爲月曆calendarView.changeMode(.MonthView)
extension CVCalendarViewController: CVCalendarViewDelegate,CVCalendarMenuViewDelegate {
//視圖模式
func presentationMode() -> CalendarMode {
//使用月視圖
return .monthView
}
//每週的第一天
func firstWeekday() -> Weekday {
//從星期一開始
return .monday
}
func presentedDateUpdated(_ date: CVDate) {
//導航欄顯示當前日曆的年月
self.title = date.globalDescription
}
//每個日期上面是否添加橫線(連在一起就形成每行的分隔線)
func topMarker(shouldDisplayOnDayView dayView: CVCalendarDayView) -> Bool {
return true
}
//切換月的時候日曆是否自動選擇某一天(本月爲今天,其它月爲第一天)
func shouldAutoSelectDayOnMonthChange() -> Bool {
return false
}
//日期選擇響應
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)
}
}