質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4125閲覧

FSCalendarで現在表示されている月の旧祝日だけ日付の色を変更したい

shu17712

総合スコア1

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/07/31 06:24

前提・実現したいこと

SwiftでFSCalendarを利用して、カレンダーアプリを製作中です。カレンダーに旧祝日の日は別の色をつけようと思っていて、以下のサイトを参考にしています。
https://develop.hateblo.jp/entry/2018/10/26/094020

発生している問題

上記のサイトの通りに実装すると、ある月のカレンダーにあるその前の月と次の月の日付の部分まで色が変わってしまいます。例えば、現在表示されている7月の日曜日と祝日だけを別の色にしたいのに、6月の日曜や8月の日曜まで色が変わってしまい、視覚的に今月なのか他の月の日なのか判別しにくくなってしまっています。

該当のソースコード

Swift

1 2// 祝日判定を行い結果を返すメソッド(True:祝日) 3 func judgeHoliday(_ date : Date) -> Bool { 4 //祝日判定用のカレンダークラスのインスタンス 5 let tmpCalendar = Calendar(identifier: .gregorian) 6 // 祝日判定を行う日にちの年、月、日を取得 7 let year = tmpCalendar.component(.year, from: date) 8 let month = tmpCalendar.component(.month, from: date) 9 let day = tmpCalendar.component(.day, from: date) 10 11 // CalculateCalendarLogic():祝日判定のインスタンスの生成 12 let holiday = CalculateCalendarLogic() 13 14 return holiday.judgeJapaneseHoliday(year: year, month: month, day: day) 15 } 16 17 18// date型 -> 年月日をIntで取得 19 func getDay(_ date:Date) -> (Int,Int,Int){ 20 let tmpCalendar = Calendar(identifier: .gregorian) 21 let year = tmpCalendar.component(.year, from: date) 22 let month = tmpCalendar.component(.month, from: date) 23 let day = tmpCalendar.component(.day, from: date) 24 return (year,month,day) 25 } 26 27//曜日判定(日曜日:1 〜 土曜日:7) 28 func getWeekIdx(_ date: Date) -> Int{ 29 let tmpCalendar = Calendar(identifier: .gregorian) 30 return tmpCalendar.component(.weekday, from: date) 31 } 32 33// 土日や祝日の日の文字色を変える 34 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? { 35 36 37 //祝日判定をする(祝日は赤色で表示する) 38 if self.judgeHoliday(date){ 39 return UIColor.red 40 } 41 //土日の判定を行う(土曜日は青色、日曜日は赤色で表示する) 42 let weekday = self.getWeekIdx(date) 43 if weekday == 1 { //日曜日 44 return UIColor.red 45 } 46 else if weekday == 7 { //土曜日 47 return UIColor.blue 48 } 49 return nil 50 } 51 52 53

試したこと

ネットで調べてみましたが、表示されている月の日付かを判定する方法の情報は見つかりませんでした。

補足情報(FW/ツールのバージョンなど)

FSCalendar 2.7.9
CalculateCalendarLogic 0.3.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

課題は残りますが、概ね下記のような実装で実現できそうな感じです。

基本的には、各セルに表示される月を求め、それが currentPage の月と異なる場合には色を変えないようにしていますが、スワイプ中はこの方法が正しく反映されません(スワイプが完了しない限りcurrentPageの月が変わらないため)。

なので、表示完了後に呼び出される delegate でカレンダーの再読み込みを行い、正しい色に反映させるようにしてあります。

なので、

  • ゆっくりスワイプすると、前後の月の週末色が正しく反映されないが、スワイプを完了すると反映される
  • 普通にスワイプする限りはあまり目立たない

といった感じになるかと思います。

Swift

1 func calendarCurrentPageDidChange(_ calendar: FSCalendar) { 2 calendar.reloadData() 3 } 4 5 // 土日や祝日の日の文字色を変える 6 func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, titleDefaultColorFor date: Date) -> UIColor? { 7 // 現在表示されているページの月とセルの月が異なる場合には nil を戻す 8 if Calendar.current.compare(date, to: calendar.currentPage, toGranularity: .month) != .orderedSame { 9 return nil 10 } 11 12 //祝日判定をする(祝日は赤色で表示する) 13 if self.judgeHoliday(date){ 14 return UIColor.red 15 } 16 17 //土日の判定を行う(土曜日は青色、日曜日は赤色で表示する) 18 let weekday = self.getWeekIdx(date) 19 if weekday == 1 { //日曜日 20 return UIColor.red 21 } 22 else if weekday == 7 { //土曜日 23 return UIColor.blue 24 } 25 return nil 26 }

投稿2020/08/03 04:58

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shu17712

2020/08/04 10:30

ありがとうございます。無事実装できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問