2017-06-30 7 views
0

UICollectionViewを使用してカレンダーを描画しています。補助ビューは、カレンダーの1日を表す列の先頭の日付に使用されます。各カレンダーは、UICollectionViewのセクションです。今日の日を強調したい。私たちは、私がこのビューに入る最初の時間が欲しいの背景を設定し、このUICollectionViewの補助ビューで更新をトリガーする方法

class WeeklyDayColumnHeader: UICollectionReusableView { 
var day: Date? { 
    didSet { 
     var dateFormatter: DateFormatter? 
     if dateFormatter == nil { 
      dateFormatter = DateFormatter() 
      dateFormatter?.dateFormat = "E d" 
     } 
     self.title!.text = dateFormatter?.string(from: day!) 
     setNeedsLayout() 
    } 
} 
var isCurrentDay: Bool = false { 
    didSet { 
     if isCurrentDay { 
      title?.textColor = UIColor.white 
      title?.font = UIFont.boldSystemFont(ofSize: CGFloat(16.0)) 
      titleBackground?.backgroundColor = UIColor(red:0.99, green:0.22, blue:0.21, alpha:1.0) 
     } 
     else { 
      title?.font = UIFont.systemFont(ofSize: CGFloat(16.0)) 
      title?.textColor = UIColor.black 
      titleBackground?.backgroundColor = UIColor.clear 
     } 

    } 
} 

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 

    var view: UICollectionReusableView? 
    if kind == WeeklyCollectionElementKindDayColumnHeader { 
     let dayColumnHeader: WeeklyDayColumnHeader? = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: WeeklyDayColumnHeaderReuseIdentifier, for: indexPath) as? WeeklyDayColumnHeader 
     let day: Date? = collectionViewCalendarLayout?.dateForDayColumnHeader(at: indexPath) 
     let currentDay: Date? = currentTimeComponents(for: self.collectionView!, layout: collectionViewCalendarLayout!) 
     let startOfDay: Date? = Calendar.current.startOfDay(for: day!) 
     let startOfCurrentDay: Date? = Calendar.current.startOfDay(for: currentDay!) 
     dayColumnHeader?.day = day 
     dayColumnHeader?.isCurrentDay = startOfDay == startOfCurrentDay 
     view = dayColumnHeader 
    } 
    else if kind == WeeklyCollectionElementKindTimeRowHeader { 
     let timeRowHeader: WeeklyTimeRowHeader? = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: WeeklyTimeRowHeaderReuseIdentifier, for: indexPath) as? WeeklyTimeRowHeader 
     timeRowHeader?.time = collectionViewCalendarLayout?.dateForTimeRowHeader(at: indexPath) 
     view = timeRowHeader 
    } 

    return view! 
} 

これにより作業することを持っています。しかし、私はこのビューを開いて日付が変更された場合、どのようにヘッダーを更新するのですか?どこに日付を設定するロジックを移動する必要がありますか、どのように "無効化"するか、何をする必要がありますか?

+0

ユーザーとの対話のために日付が変わるこのような何か? – Barns

+0

invalidateは補足ビューを再描画するようトリガしていないようです。それは限界か、おそらく正しく配線されたものがありませんか? –

+0

ユーザインタラクション(例えば、ユーザタップされたセル)のために日付を変更する必要がある場合は、 'didSelectItemAtIndexPath'メソッドを実装する必要があります。 – Barns

答えて

0

時間の変更を通知するためにUIApplicationSignificantTimeChangeNotificationを使用してください。

これを実装するにはNotificationCenterを使用してください。

NotificationCenter.defaultCenter().addObserver(self, selector: "dayChanged:", name: UIApplicationSignificantTimeChangeNotification, object: nil) 

次にあなたが変更を処理する機能が必要になります:

func dayChanged(notification: NSNotification){ 

    // trigger the changes you need here 
} 
+0

dayChangedでは、どのようにセクションヘッダーを再描画しますか? –

+0

あなたのコレクションビューにはおそらく 'myCollectionView'という名前の' IBOutlet' varがあります。その後、 'myCollectionView.reloadData()'を呼び出すことはそのトリックを行うべきです。 – Barns

+0

ヘッダを再ロードするだけでは、 'collectionView reloadSections'を使うことができます。更新したいインデックス範囲を知る必要があります。 – Barns

関連する問題