自定義UI控件:datePicker日期的下拉列表

//
//  UICustomDatePicker.swift
//  ANAPAY
//
//  Created by DBS部 電通國際情報サービス on 2019/11/12.
//  Copyright © 2019 isid. All rights reserved.
//

import UIKit

struct CustomDatePickerSet {
    //UITextfieldに紐づいてる
    weak var dateField: UITextField?
    //UIDatePickerを定義するための変數
    var datePicker: UIDatePicker
    
    //日付のフォーマット
    var dateFormatter: DateFormatter

    init(dateField: UITextField, defaultDate: String, strDateformat: String = "yyyy年MM月dd日") {
        self.dateField = dateField
        self.datePicker = UIDatePicker()
        // ピッカー設定
        self.datePicker.datePickerMode = .date
        self.datePicker.locale = Locale(identifier: "ja_JP")
        self.datePicker.minimumDate = Calendar.current.date(from: DateComponents(year: 1900, month:1, day:1))
        self.datePicker.maximumDate = Date()
        
        self.dateField?.inputView = datePicker
        
        self.dateFormatter = DateFormatter();
        self.dateFormatter.dateFormat = strDateformat
        
        // デフォルト日付設定する
        self.datePicker.date = dateFormatter.date(from: defaultDate)!
    }
}

extension CustomDatePickerSet {
    mutating func setTextField() {
        //datePickerで指定した日付が表示される
        self.dateField?.text = "\(self.dateFormatter.string(from: self.datePicker.date))"
        self.dateField?.endEditing(true)
    }
}

class UIDatePickButtonItem: UIBarButtonItem {
    var cDatePicker: CustomDatePickerSet?
}

class CustomDatePicker: NSObject {
    private static let shared = CustomDatePicker()
    
    private override init() {
        super.init()
    }
    
    static func create(dateField: UITextField, defaultDate: String = "1990年01月01日") {
        shared.createDatePicker(dateField: dateField, defaultDate: defaultDate)
    }
    
    private func createDatePicker(dateField: UITextField, defaultDate: String) {

        let cDatePicker = CustomDatePickerSet(dateField: dateField, defaultDate: defaultDate)
        
        // 決定バーの生成
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: cDatePicker.datePicker.frame.size.width, height: 30))
        let spaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneItem = UIDatePickButtonItem(title: "完了", style: .done, target: self, action: #selector(done(_:)))
        doneItem.tintColor = UIColor.init(hexcode: "#5BADE1")
        doneItem.cDatePicker = cDatePicker
        
        toolbar.setItems([spaceItem, doneItem], animated: false)
        toolbar.sizeToFit()

        // インプットビュー設定(紐づいているUITextfieldへ代入)
        cDatePicker.dateField?.inputAccessoryView = toolbar
        
        cDatePicker.dateField?.delegate = self
    }

    // UIDatePickerのDoneを押したら発火
    @objc func done(_ sender: UIDatePickButtonItem) {
        sender.cDatePicker?.setTextField()
    }
}

extension CustomDatePicker: UITextFieldDelegate {
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        textField.isUserInteractionEnabled = false
        return true
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.isUserInteractionEnabled = true
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        return false
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章