こんにちは、おーしまです。
今回は「FSCalendar」と言うライブラリを使ってみたので、ご紹介します。
完成形
こんな感じでカレンダーを表示できました。
スワイプすることで表示する月を変更できて、日付をタップして処理を走らせたりすることができます。
デフォルトは英語表記なので、日本語表記にしたり、色をいろいろ変えたりしてこの形にしました。
参考になれば幸いです。
import UIKit import FSCalendar import CalculateCalendarLogic class CalendarViewController: UIViewController { @IBOutlet weak var calendarView: FSCalendar! override func viewDidLoad() { super.viewDidLoad() self.calendarView.dataSource = self self.calendarView.delegate = self setupCalendar() } private func setupCalendar() { //年月、曜日を日本語に変更 calendarView.appearance.headerDateFormat = "YYYY年MM月" calendarView.calendarWeekdayView.weekdayLabels[0].text = "日" calendarView.calendarWeekdayView.weekdayLabels[1].text = "月" calendarView.calendarWeekdayView.weekdayLabels[2].text = "火" calendarView.calendarWeekdayView.weekdayLabels[3].text = "水" calendarView.calendarWeekdayView.weekdayLabels[4].text = "木" calendarView.calendarWeekdayView.weekdayLabels[5].text = "金" calendarView.calendarWeekdayView.weekdayLabels[6].text = "土" // calendarの曜日部分の色を変更 calendarView.calendarWeekdayView.weekdayLabels[0].textColor = .systemRed calendarView.calendarWeekdayView.weekdayLabels[6].textColor = .systemBlue //最初に今日の日付を選択する let myDate = Date() let tempCalendar = Calendar.current let nowYear = tempCalendar.component(.year, from: myDate) let nowMonth = tempCalendar.component(.month, from: myDate) let nowDay = tempCalendar.component(.day, from: myDate) let selectDate = tempCalendar.date(from: DateComponents(year: nowYear, month: nowMonth, day: nowDay)) calendarView.select(selectDate) } } extension CalendarViewController: FSCalendarDelegate, FSCalendarDataSource, FSCalendarDelegateAppearance { // 土日や祝日の日の文字色を変える func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? { //今月だけ let dateDC = Calendar.current.dateComponents([.year, .month], from: date) let todayDC = Calendar.current.dateComponents([.year, .month], from: Date()) if dateDC == todayDC { //今日の日付 let dateDC = Calendar.current.dateComponents([.year, .month, .day], from: date) let todayDC = Calendar.current.dateComponents([.year, .month, .day], from: Date()) if dateDC == todayDC { return UIColor.white } //祝日判定をする(祝日は赤色で表示する) if self.judgeHoliday(date){ return UIColor.red } //土日の判定を行う(土曜日は青色、日曜日は赤色で表示する) let weekday = self.getWeekIdx(date) if weekday == 1 { //日曜日 return UIColor.red } else if weekday == 7 { //土曜日 return UIColor.blue } } return nil } //今日の日付の背景色 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, fillDefaultColorFor date: Date) -> UIColor? { let dateDC = Calendar.current.dateComponents([.year, .month, .day], from: date) let todayDC = Calendar.current.dateComponents([.year, .month, .day], from: Date()) if dateDC == todayDC { return UIColor.init(named: "today") } return nil } //選択した日付の背景色 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, fillSelectionColorFor date: Date) -> UIColor? { return UIColor.systemTeal } //選択した日付の文字色 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleSelectionColorFor date: Date) -> UIColor? { return UIColor.black } //週の番号を取得する func getWeekIdx(_ date: Date) -> Int{ let tmpCalendar = Calendar(identifier: .gregorian) return tmpCalendar.component(.weekday, from: date) } //祝日かどうか判定する private func judgeHoliday(_ date: Date) -> Bool { let tmpCalendar = Calendar(identifier: .gregorian) let year = tmpCalendar.component(.year, from: date) let month = tmpCalendar.component(.month, from: date) let day = tmpCalendar.component(.day, from: date) let holiday = CalculateCalendarLogic() return holiday.judgeJapaneseHoliday(year: year, month: month, day: day) } }
今回はここまでです。
それでは、また