【Swift UIKit】FSCalendarの使い方!イベントの登録や画像の表示

この記事からわかること

  • SwiftUIKitFSCalendar実装する方法
  • Interface Builderから使用する方法
  • コードで実装するには?
  • デザイン変更する方法
  • calendar(デリゲートメソッド)の使い方
  • 選択された日時取得する
  • イベント登録する

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

FSCalendarとは?

【Swift UIKit】FSCalendarの使い方!イベントの登録方法と表示

FSCalendarとはiOSアプリにカレンダー機能を導入することができるライブラリです。カレンダーを表示するだけでなく、イベントの登録やスワイプしてマークをつけるなどさまざまな機能が簡単に実装可能になっています。

Github-FSCalender

インストール方法

おすすめ記事:【Swift UI】CocoaPodsのインストール方法と使い方!

FSCalendarを導入するために今回はライブラリ管理ツール「Cocoa Pods」を使用します。PodFileの中に以下のようにpod 'FSCalendar'を追加してターミナルからpod installを実行します。


target 'UIKitTest' do
  # Pods for UIKitTest
  pod 'FSCalendar'
end

これで導入が完了したので実際に使用してみます。

Interface Builderから使用する

Storyboard(Interface Builder)を使ってカレンダーを表示させるには以下の手順に沿って実装していきます。

  1. Interface BuilderでUIViewを追加
  2. Custom Classを「FSCalender」に変更(Enterでプレビューが変わる)
  3. dataSourceとdelegateをViewControllerと紐付ける
  4. ViewController内で「import FSCalendar」でライブラリを読み込む
  5. カレンダーのアウトレット変数を定義
  6. Interface Builderで変数と紐付け
【Swift UIKit】FSCalendarの使い方!イベントの登録方法と表示

※ライブラリを導入していないと「FSCalender」が出てこないので注意してください。


import UIKit
import FSCalendar

class ViewController: UIViewController{

    @IBOutlet  weak var calendar: FSCalendar!
    
    override func viewDidLoad() {
      super.viewDidLoad()
    }
}

何も設定していない状態だと以下のようなカレンダーが表示されました。

【Swift UIKit】FSCalendarの使い方!イベントの登録方法と表示

コードから導入する

コードから導入する場合はViewControllerクラスをFSCalendarDataSourceFSCalendarDelegateプロトコルに準拠させて以下のように記述します。


import UIKit
import FSCalendar

class ViewController: UIViewController,FSCalendarDataSource,FSCalendarDelegate {
    
      override func viewDidLoad() {
        super.viewDidLoad()
        let calendar = FSCalendar(frame: CGRect(x: 50, y: 200, width: 320, height: 300))
        calendar.dataSource = self
        calendar.delegate = self
        view.addSubview(calendar)
      }
}

デザインや設定をカスタマイズする

Interface Builder上からカレンダーの見た目や設定を変更するにはプロパティを変更するだけです。

【Swift UIKit】FSCalendarの使い方!イベントの登録方法と表示

コードから変更するにはcalendar.appearanceに続いてInterface Builderから確認できたプロパティ名を指定することで変更することができます。

override func viewDidLoad() {
    super.viewDidLoad()
    let calendar = FSCalendar(frame: CGRect(x: 50, y: 200, width: 320, height: 300))
    calendar.dataSource = self
    calendar.delegate = self
    view.addSubview(calendar)
    calendar.appearance.calendar.firstWeekday = 1 // 月曜日からに変更
    calendar.appearance.weekdayTextColor = UIColor.orange
    calendar.appearance.headerTitleColor = UIColor.orange
}

デリゲートメソッドを実装する

用意されているデリゲートメソッドを使用することでさまざまな情報を取得したり変更したりすることができます。そのためにはFSCalendarDataSourceFSCalendarDelegateプロトコルへの準拠が必要になります。デリゲートメソッド名はcalendarです。

おすすめ記事:【Swift】FSCalendarのデリゲート(calendar)メソッド一覧!

選択された日時を取得する

calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition)メソッドを使用すればユーザーが選択した日付情報を取得することができます。

下記は「取得した日付をラベルに表示する」サンプルコードです。

class ViewController: UIViewController,FSCalendarDataSource,FSCalendarDelegate {
    
    var label:UILabel!
    let df = DateFormatter()
    
    override func viewDidLoad() {
      super.viewDidLoad()
      let calendar = FSCalendar(frame: CGRect(x: 50, y: 200, width: 320, height: 300))
      calendar.dataSource = self
      calendar.delegate = self
      view.addSubview(calendar)
      label = UILabel(frame: CGRect(x: 50, y: 400, width: 320, height: 300))
      view.addSubview(label)
    }
    
    func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
        df.dateFormat = "yyyy-MM-dd"
        label.text = df.string(from: date)
    }
    
}

イベント(ドット)を登録する

カレンダーにイベントを登録するにはcalendar(_:numberOfEventsFor date: Date)メソッドを使用します。イベントと呼んでいますがカレンダーに表示されるのは以下のようなドットです。

【Swift UIKit】FSCalendarの使い方!イベントの登録方法と表示

実装方法は以下の通りです。1行ずつコードを整理していきます。

class ViewController: UIViewController,FSCalendarDataSource,FSCalendarDelegate {
    
    let df = DateFormatter()
    let eventArray = ["2022-10-04","2022-10-12","2022-10-18"]
    
      override func viewDidLoad() {
        super.viewDidLoad()
        let calendar = FSCalendar(frame: CGRect(x: 50, y: 200, width: 320, height: 300))
        calendar.dataSource = self
        calendar.delegate = self
        view.addSubview(calendar)
      }
    
    func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
        df.dateFormat = "yyyy-MM-dd"
        if eventArray.first(where: { $0 == df.string(from: date) }) != nil {
                return 1
        }
        return 0
    }
}

まずはイベントを表示する日付を配列で定義します。このフォーマットとDateFormatterのフォーマットは同じものにして置いてください。

おすすめ記事:【Swift】DateFormatterの使い方!書式や日付形式の調整方法

calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date)の使い方

イベントを登録するにはcalendarメソッドの返り値で1を返せばドットが表示され、0を返せば何も表示されません。また引数にはFSCalendarインスタンスと日付が全てループして格納されます。一度出力して見ると日付が回されているのが確認できます。

func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
  print(date)
}

2022-09-24 15:00:00 +0000
2022-09-25 15:00:00 +0000
〜〜〜〜〜〜〜〜〜〜〜〜〜
2022-10-30 15:00:00 +0000
2022-10-31 15:00:00 +0000
2022-11-01 15:00:00 +0000
2022-11-02 15:00:00 +0000
2022-11-03 15:00:00 +0000
2022-11-04 15:00:00 +0000

あとは格納されている日付に対して配列内に同じ日付があれば1を、なければ0を返すようにすれば配列内の日付をイベントとして登録することができます。

func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
    df.dateFormat = "yyyy-MM-dd"
    if eventArray.first(where: { $0 == df.string(from: date) }) != nil {
            return 1
    }
    return 0
}

おすすめ記事:【Swift】配列の要素を検索してインデックスを取得する方法!first/firstIndex

画像を表示する

イベント(ドット)ではなく好きな画像を表示させることも可能です。その場合はcalendar(_:imageFor date: Date)メソッドを使用します。このメソッドも日付をループしているので表示させたい日付の時だけ画像を、それ以外はnilを返すことで非表示にすることが可能です。

【Swift UIKit】FSCalendarの使い方!イベントの登録方法と表示
func calendar(_ calendar: FSCalendar, imageFor date: Date) -> UIImage? {
    df.dateFormat = "yyyy-MM-dd"
    let image = UIImage(systemName: "iphone")
    if eventArray.first(where: { $0 == df.string(from: date) }) != nil {
        return image
    }
    return nil
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index