// // 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 dayLayout: NSLayoutConstraint! @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 weak var weekButton: UIButton! weak var delegate: DateSegmentViewDelegate? private let date = DateInRegion() 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 } */ }