実現したい事は、このカレンダーに登録した予定を表示したいのです。
現状としまして
- タップしたセルが何年の何月何日なのかを取得する方法がわからない
- 日時からセルを特定する実装方法がイメージできない
です。
完成イメージはGoogleカレンダーのような感じです。
よろしくお願いします。
カレンダーのソースコードです。
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
let dateManager = DateManager()
let daysPerWeek: Int = 8
let cellMargin: CGFloat = 2.0
var selectedDate = Date()
var today: Date!
let weekArray = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
@IBOutlet weak var headerView: UIView!
@IBOutlet weak var headerTitle: UILabel!
@IBOutlet weak var headerPrevBtn: UIButton!
@IBOutlet weak var headerNextBtn: UIButton!
@IBOutlet weak var calendarCollectionView: UICollectionView!
//MARK:- Override
// --------------------------------------------------------------------------------
// viewDidLoad()
// --------------------------------------------------------------------------------
override func viewDidLoad() {
super.viewDidLoad()
let dateFormater = DateFormatter()
dateFormater.locale = Locale(identifier: "ja_JP")
dateFormater.dateFormat = "yyyy/MM/dd"
let oneDay = "2018/12/16"
print(oneDay)
let castDate = dateFormater.date(from: oneDay)
print(castDate)
cellSizeSet()
headerTitle.text = changeHeaderTitle(date: selectedDate)
calendarCollectionView.delegate = self
calendarCollectionView.dataSource = self
calendarCollectionView.backgroundColor = UIColor.white
}
//MARK:- Method
// --------------------------------------------------------------------------------
// changeHeaderTitle(date: Date) -> String
// --------------------------------------------------------------------------------
func changeHeaderTitle(date: Date) -> String {
let formatter: DateFormatter = DateFormatter()
formatter.dateFormat = "yyyy年/M月"
let selectMonth = formatter.string(from: selectedDate)
return selectMonth
}
func cellSizeSet() {
let numberOfMargin: CGFloat = 8.0
let width: CGFloat = (calendarCollectionView.frame.width - cellMargin * numberOfMargin) / CGFloat(daysPerWeek)
let height: CGFloat = width * 1.0
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: width, height: height)
calendarCollectionView.collectionViewLayout = layout
}
//MARK:- Delegate
// --------------------------------------------------------------------------------
// numberOfSections(in collectionView: UICollectionView) -> Int
// --------------------------------------------------------------------------------
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 2
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if section == 0 {
return 7
} else {
return dateManager.daysAcquisition()
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = calendarCollectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CalendarCell
//テキストカラー
if (indexPath.row % 7 == 0) {
cell.textLabel.textColor = UIColor.red
} else if (indexPath.row % 7 == 6) {
cell.textLabel.textColor = UIColor.blue
} else {
cell.textLabel.textColor = UIColor.gray
}
//テキスト配置
if indexPath.section == 0 {
cell.textLabel.text = weekArray[indexPath.row]
} else {
cell.textLabel.text = dateManager.conversionDateFormat(indexPath: indexPath)
}
let selectedBGView = UIView(frame: cell.frame)
selectedBGView.backgroundColor = .blue
cell.selectedBackgroundView = selectedBGView
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print(indexPath)
print(indexPath.row)
}
//MARK:- Action
// --------------------------------------------------------------------------------
// oPrevBtn(_ sender: Any)
// --------------------------------------------------------------------------------
@IBAction func oPrevBtn(_ sender: Any) {
selectedDate = dateManager.prevMonth(date: selectedDate)
calendarCollectionView.reloadData()
headerTitle.text = changeHeaderTitle(date: selectedDate)
}
@IBAction func oNextBtn(_ sender: Any) {
selectedDate = dateManager.nextMonth(date: selectedDate)
calendarCollectionView.reloadData()
headerTitle.text = changeHeaderTitle(date: selectedDate)
}
}
extension UIColor {
class func lightBlue() -> UIColor {
return UIColor(red: 92.0 / 255, green: 192.0 / 255, blue: 210.0 / 255, alpha: 1.0)
}
class func lightRed() -> UIColor {
return UIColor(red: 195.0 / 255, green: 123.0 / 255, blue: 175.0 / 255, alpha: 1.0)
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
・タップしたセルが何年の何月何日なのかを取得する方法がわからない
・日時からセルを特定する実装方法がイメージできない
両方とも、表示するセルのIndexと年月日の情報を紐付けしたら解決する問題です
単純に、Indexと年月日の情報の配列を用意したら良いのでは
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
質問の意図がわかりませんが、
iOS標準のカレンダーから予定をひっぱりたい、という意味であれば以下が参考になると思います。
SwiftでiOS標準カレンダーを使う方法
https://qiita.com/katzhide/items/47b06736c5bfe60f25d0
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
2018/12/19 20:34
複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。