WWPerpetualCalendar

Swift-5.6 iOS-14.0 TAG Swift Package Manager-SUCCESS LICENSE

Introduction - 简介

Achievements display - 成果展示

WWPerpetualCalendar

Installation with Swift Package Manager - 安装方式

dependencies: [
    .package(url: "https://github.com/William-Weng/WWPerpetualCalendar.git", .upToNextMajor(from: "1.1.0"))
]

Usage - 使用方式

WWPerpetualCalendar

Function - 可用函数

函数 功能
build(baseDate:perpetualCalendarDelegate:) 建立WWPerpetualCalendar
previousMonth(animated:completion:) 回到上一个月
nextMonth(animated:completion:) 到下一个月
someMonth(selectDate:) 到某一个月

WWPerpetualCalendarDelegate

函数 功能
calendarItemView(collectionView:dates:viewForItemAt:firstDayOfMonth:) 自定义的CellView
willChangeViewController(calendar:firstDayOfMonth:error:) 将要换到下一个月
didChangeViewController(calendar:firstDayOfMonth:error:) 已经换到下一个月
didSelectItem(collectionView:dates:at) 点选到该月的某一天

Example - 程式范例

import UIKit
import WWOnBoardingViewController
import WWPerpetualCalendar

final class ViewController: UIViewController {
    
    var perpetualCalendar: WWPerpetualCalendar!
    
    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var myLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        initSetting()
    }
    
    @IBAction func previousMonth(_ sender: UIBarButtonItem) {
        perpetualCalendar.previousMonth(completion: nil)
    }
    
    @IBAction func nextMonth(_ sender: UIBarButtonItem) {
        perpetualCalendar.nextMonth(completion: nil)
    }
    
    @IBAction func someMonth(_ sender: UIButton) {
        guard let date = Date()._adding(component: .month, value: Int.random(in: 5...10)) else { return }
        self.perpetualCalendar.someMonth(selectDate: date)
    }
}

extension ViewController: WWPerpetualCalendarDelegate {
    
    func calendarItemView(collectionView: UICollectionView, dates: [Date], viewForItemAt indexPath: IndexPath, firstDayOfMonth: Date?) -> UIView {
        return cellViewMaker(collectionView: collectionView, dates: dates, viewForItemAt: indexPath, firstDayOfMonth: firstDayOfMonth)
    }
    
    func didSelectItem(collectionView: UICollectionView, dates: [Date], at indexPath: IndexPath) {
        didSelectItemAction(collectionView: collectionView, dates: dates, at: indexPath)
    }
    
    func willChangeViewController(calendar: WWPerpetualCalendar, firstDayOfMonth: Date?, error: WWOnBoardingViewController.OnBoardingError?) {
        willChangeViewControllerAction(calendar: calendar, firstDayOfMonth: firstDayOfMonth, error: error)
    }
    
    func didChangeViewController(calendar: WWPerpetualCalendar, firstDayOfMonth: Date?, error: WWOnBoardingViewController.OnBoardingError?) {
        didChangeViewControllerAction(calendar: calendar, firstDayOfMonth: firstDayOfMonth, error: error)
    }
}

private extension ViewController {
    
    func initSetting() {
        let perpetualCalendar = WWPerpetualCalendar.build(perpetualCalendarDelegate: self)!
        self.perpetualCalendar = perpetualCalendar
        self._addChild(on: containerView, to: perpetualCalendar)
    }
    
    func cellViewMaker(collectionView: UICollectionView, dates: [Date], viewForItemAt indexPath: IndexPath, firstDayOfMonth: Date?) -> UIView {
        
        guard let date = dates[safe: indexPath.row],
              let firstDayOfMonth = firstDayOfMonth
        else {
            fatalError()
        }
        
        let cellView = CellView()
        cellView.configure(date: date, firstDayOfMonth: firstDayOfMonth)
        
        return cellView
    }
    
    func didSelectItemAction(collectionView: UICollectionView, dates: [Date], at indexPath: IndexPath) {
        
        guard let selectedDate = dates[safe: indexPath.row] else { return }
                
        collectionView.visibleCells.forEach { cell in
            
            guard let cell = cell as? WWCalendarCollectionViewCell,
                  let cellView = cell.subviews.last as? CellView
            else {
                return
            }
            
            cellView.selectedView.isHidden = (cell.indexPath != indexPath) ? true : false
        }
        
        myLabel.text = selectedDate._localTime(with: .short)
    }
    
    func willChangeViewControllerAction(calendar: WWPerpetualCalendar, firstDayOfMonth: Date?, error: WWOnBoardingViewController.OnBoardingError?) {
        
        if let error = error { myLabel.text = "\(error)"; return }
        myLabel.text = title
    }
    
    func didChangeViewControllerAction(calendar: WWPerpetualCalendar, firstDayOfMonth: Date?, error: WWOnBoardingViewController.OnBoardingError?) {
        
        if let error = error { myLabel.text = "\(error)"; return }
        
        title = firstDayOfMonth?._localTime(with: .yearMonth)
        myLabel._fadeEffect(0.5)
        myLabel.text = title
    }
}