おーしまブログ

プログラミングやってます

【swift】FSCalendar使ってみた

こんにちは、おーしまです。

今回は「FSCalendar」と言うライブラリを使ってみたので、ご紹介します。


完成形
f:id:tomo_bb_aki0118115:20210619230524p:plain:w300:h600

こんな感じでカレンダーを表示できました。
スワイプすることで表示する月を変更できて、日付をタップして処理を走らせたりすることができます。

デフォルトは英語表記なので、日本語表記にしたり、色をいろいろ変えたりしてこの形にしました。



参考になれば幸いです。



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)
    }
}

今回はここまでです。
それでは、また

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}