テックキャンプ160日目〜FSCalendarのロジック

kobasaです(´ω`*)
前回の続きになります。FSCalendarで本日のマスだけ枠線の色を変更する記述と、
指定した曜日の文字色を変更する記述をメモしていきます。

本日のマスだけ枠線の色を変更する

まずは日付を比較しやすくする為に、日付のフォーマットを変換するロジックを作成します。

func dateFormatter(day: Date) -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    return formatter.string(from: day)
}

formatter.dateFormat = "yyyy-MM-dd"の記述で日付の表示を
“2021-05-15″のように変換しています。MMの部分は大文字にする必要があるぽい。
変換しないと日付を生成したときに時間なども表示されてしまい、比較がし辛いため。
その後、引数で受け取った日付をフォーマット変換して返しています。

次に枠線の色を変更する処理の中に、本日のマスだけ色を変更する記述をします。

func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, borderDefaultColorFor date: Date) -> UIColor? {

    if dateFormatter(day: date) == dateFormatter(day: Date()) {
        return colors.bluePurple
    }
    return .clear
}

if文の左辺のdateFSCalendarの関数から渡され、表示する月の日数+aの数だけ呼ばれるようです。
それを引数にして1日ずつ先ほどのフォーマット変換を行っています。
右辺のDate()は本日の日付を生成し、フォーマット変換を行っています。

これによりカレンダーの日付と本日の日付が一致した部分のみ枠線の色が青紫になります。

指定した曜日の文字色を変更

土曜と日曜の日付の色を変更していきます。まずは曜日判定をするロジックを作成します。

func judgeWeekday(_ date: Date) -> Int {

    let calendar = Calendar(identifier: .gregorian)
    return calendar.component(.weekday, from: date)
}

Calendar(identifier: .gregorian)でグレグリオ歴という
西暦の日付設定をしたカレンダーのインスタンスを生成しています。

componentメソッドは第二引数の日付情報から第一引数で指定した情報を返してくれます。
この場合は引数で渡されたある日付dateの曜日情報を返します。
返される曜日情報は「日曜日:1〜土曜日:7」となっています。

次に日付の文字色を変更する処理の中に、土・日曜日の色を変更する記述をします。

func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? {
    // 曜日によって文字色を変更
    if judgeWeekday(date) == 1 { // 日曜日の場合
        return UIColor(red: 150/255, green: 30/255, blue: 0/255, alpha: 0.9)
    } else if judgeWeekday(date) == 7 { // 土曜日の場合
        return UIColor(red: 0/255, green: 30/255, blue: 150/255, alpha: 0.9)
    }
        return colors.black // それ以外の曜日の文字色
    }

引数で渡すdateは、「本日の日付のみ枠線の色を変更する記述」と同じ
FSCalendarの関数から渡され、表示する月の日数+aの数だけ呼ばれるものです。

曜日判定の結果が1で日曜日の場合の処理と、7で土曜日の場合の処理を記述しています。

コメント

タイトルとURLをコピーしました