はじめに
JTAppleCalendarを触る機会がたまたまあり、記事を執筆当時に公式チュートリアルにバージョン7系は記されていましたが、バージョン8.0.0のページでは具体的な使い方は記述されていませんでした。
そこで、バージョン8系での簡単な処理についてまとめてみました。
これからの流れは、こちらの記事をベースに進めています。
手順
前準備
適当なプロジェクトを作成します。今回は、JTAppleCalendarSample
で作成しました。
今回JTAppleCalendarはcocoapodsでインストールします。
この記事ではバージョンは8.0.3
をインストールしています。
インストールの方法はベースの記事を参照してください。
インストール後は.xcworkspace
を開いてください。
実装
パーツ
プロジェクトを開いて、まずはパーツを設置しましょう。
Main.storyboard
ではUIView(オレンジ背景)の上にUICollectionViewを設置します。
曜日の部分は適当にUILabelを並べています。
CollectionViewのCustom ClassはClassをJTACMonthView
、moduleをJTAppleCalendar
にしてください。
セルの境界をわかるようにするため、Min Spacingを設定しておきます。
カスタムセル
カレンダーの日付部分のセルのファイルを生成します。
MainCalendarViewCell
というクラス名にし、親クラスはJTACDayCell
を入力して下さい。(バージョン7系ではJTAppleCellでした)
XIBファイルも同時に作成しておきます。
MainCalendarCell.xib
では、Labelは縦横中心に設置しております。
セルとセルの境界をわかるようにするため、背景に色を付けています。
セルのCustom ClassはMyCalendarViewCell
にして、同様にIdentifierにも同様にもMyCalendarViewCell
を設定します。
実装ですることは3つ
- JTAppleCalendarをimport
- MainCalendarViewCell.xibで置いたLabelをOutlet接続
- configureメソッドを作成(カレンダークラスで使用)
まとめたものが以下です。
import UIKit
import JTAppleCalendar // 1
class MyCalendarViewCell: JTACDayCell {
@IBOutlet weak var titleLabel: UILabel! // 2
/// 3 セルの表示の設定をする
/// ex.ラベルに日にちを入れる
func configure(cellState: CellState) {
titleLabel.text = cellState.text
}
}
カレンダービュー
次にカレンダービューの実装をします。
UIViewクラスを継承したMyCalendarView.swift
を作成します。
ここでやることは、
- JTAppleCalendarをimport
- Main.storyboadで設置したカレンダービューをOutlet接続する
- delegateとdatasourceを定義する
- cellの登録をする
です。
import UIKit
import JTAppleCalendar // 1
class MyCalendarView: UIView {
@IBOutlet var calendarView: JTACMonthView! // 2
override func awakeFromNib() {
// 3 delegateとdetasourceの定義
calendarView.calendarDelegate = self
calendarView.calendarDataSource = self
// 4 MainCalendarCellの登録
let nibName = UINib(nibName: "MyCalendarViewCell", bundle:nil)
calendarView.register(nibName, forCellWithReuseIdentifier: "MyCalendarViewCell")
}
}
Delegate
上のメソッドは空の記述でも動きますが、下のメソッドと同様のコードを書く必要があるようです。
理由はこちらのProblem 1を参照してください。
extension MyCalendarView: JTACMonthViewDelegate {
func calendar(_ calendar: JTACMonthView, willDisplay cell: JTACDayCell, forItemAt date: Date, cellState: CellState, indexPath: IndexPath) {
let cell = cell as! MyCalendarViewCell
cell.configure(cellState: cellState)
}
// cellの設定
func calendar(_ calendar: JTACMonthView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTACDayCell {
let cell = calendar.dequeueReusableCell(withReuseIdentifier: "MyCalendarViewCell", for: indexPath) as! MyCalendarViewCell
cell.configure(cellState: cellState)
return cell
}
}
Datasoure
extension MyCalendarView: JTACMonthViewDataSource {
// カレンダー作成に必要なパラメータの設定
func configureCalendar(_ calendar: JTACMonthView) -> ConfigurationParameters {
var current = Calendar.current
current.locale = Locale(identifier: "ja_JP")
current.timeZone = TimeZone(identifier: "Asia/Tokyo")!
let date = Date()
let startDate = date // 現在
let endDate = current.date(byAdding: .month,
value: +1,
to: current.startOfDay(for: date)) //1月後
let parameters = ConfigurationParameters(startDate: startDate,
endDate: endDate!,
numberOfRows: 5,
calendar: current,
firstDayOfWeek: .sunday)
return parameters
}
}
結果
これを実行すると、下記のような画面でカレンダーが表示されます。
おわりに
基本的にはバージョン7系のときと使い方は変わりませんでした。
オブジェクト名が変わっているので、そこは注意が必要なようですね。