DateSegmentView.swift 4.22 KB
//
//  DateSegmentView.swift
//  Twear
//
//  Created by yangbin on 2021/11/19.
//

import UIKit
import SwiftDate


enum DateType : Int {
    case day = 0
    case week
    case month
    case year
}

protocol DateSegmentViewDelegate: NSObjectProtocol {
    func didSelectedDate(date: DateInRegion, dateType: DateType)
}

class DateSegmentView: UIView {
    
    @IBOutlet weak var dateTypeView: UIView!
    var normalColor: UIColor = .black
    var selectedColor: UIColor = .blue {
        didSet {
            dayButton.setTitleColor(selectedColor, for: .normal)
        }
    }
    
    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet private weak var monthButton: UIButton!
    @IBOutlet private weak var dayButton: UIButton!
    @IBOutlet private weak var yearButton: UIButton!
    @IBOutlet private weak var weekButton: UIButton!
    
    weak var delegate: DateSegmentViewDelegate?
    private let date = DateInRegion()
    private var dateType: DateType = .day
    private var dayCount: Int = 0
    private var weekCount: Int = 0
    private var monthCount: Int = 0
    private var yearCount: Int = 0
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        initFromNib()
        setupUI()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        initFromNib()
        setupUI()
    }
    
    private func initFromNib() {
        if let view = Bundle.main.loadNibNamed("DateSegmentView", owner: self, options: nil)?.first as? UIView {
            view.frame = bounds
            self.addSubview(view)
        }
    }
    
    
    
    
    @IBAction func clickLeftButton(_ sender: Any) {
        updateDate(-1)
    }
    @IBAction func clickRightButton(_ sender: Any) {
        updateDate(1)
    }
    func updateDate(_ count: Int = 0) {
        var selectedDate = DateInRegion()
        switch dateType {
        case .day:
            let newDate = date + (dayCount+count).days
            if newDate.isInFuture {
                return
            }
            dayCount += count
            selectedDate = newDate
            dateLabel.text = newDate.toString(.custom("yyyy.MM.dd"))
        case .week:
            let newDate = (date-1.days).dateAt(.startOfWeek) + (weekCount+count).weeks + 1.days
            if newDate.isInFuture {
                return
            }
            weekCount += count
            selectedDate = newDate
            let startDate = ((date-1.days).dateAt(.startOfWeek) + weekCount.weeks + 1.days).toString(.custom(
                "yyyy.MM.dd"))
            let endDate = ((date-1.days).dateAt(.endOfWeek) + weekCount.weeks + 1.days).toString(.custom("yyyy.MM.dd"))
            dateLabel.text = "\(startDate)-\(endDate)"
        case .month:
            let newDate = date + (monthCount+count).months
            if newDate.isInFuture {
                return
            }
            selectedDate = newDate
            monthCount += count
            dateLabel.text = newDate.toString(.custom("yyyy.MM"))
        case .year:
            let newDate = date + (yearCount+count).years
            if newDate.isInFuture {
                return
            }
            selectedDate = newDate
            yearCount += count
            let year = newDate.toString(.custom("yyyy"))
            dateLabel.text = "\(year).01-\(year).12"
        }
        delegate?.didSelectedDate(date: selectedDate, dateType: dateType)
    }
    

    
    func setupUI() {
        dayButton.setTitleColor(selectedColor, for: .normal)
        dateLabel.text = date.toString(.custom("yyyy.MM.dd"))
    }

    
    @IBAction func selectedDate(_ sender: UIButton) {
        monthButton.setTitleColor(normalColor, for: .normal)
        dayButton.setTitleColor(normalColor, for: .normal)
        yearButton.setTitleColor(normalColor, for: .normal)
        weekButton.setTitleColor(normalColor, for: .normal)
        sender.setTitleColor(selectedColor, for: .normal)
        dateType = DateType(rawValue: sender.tag) ?? .day
//        delegate?.didSelectedDate(dateType: dateType)
        updateDate()
    }
    
    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

}