// // CreditCardView.swift // GME Remit // // Created by InKwon James Kim on 2019/10/15. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit @IBDesignable class CreditCardView: UIView { private enum PickerType: Int { case month = 0 case year } private let xibName = "CreditCardView" @IBOutlet private weak var firstNumberTextField: UITextField! @IBOutlet private weak var secondNumberTextField: UITextField! @IBOutlet private weak var thirdNumberTextField: UITextField! @IBOutlet private weak var fourthNumberTextField: UITextField! @IBOutlet private weak var monthTextField: UITextField! @IBOutlet private weak var yearTextField: UITextField! @IBOutlet private weak var cardCompanyImageView: UIImageView! private var textFields: [UITextField]? private var months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10" ,"11", "12"] private var years = [String]() override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } private func commonInit() { guard let view = Bundle.main.loadNibNamed( xibName, owner: self, options: nil )?.first as? UIView else { return } view.frame = self.bounds view.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.layer.cornerRadius = 10 self.addSubview(view) textFields = [ firstNumberTextField, secondNumberTextField, thirdNumberTextField, fourthNumberTextField, monthTextField, yearTextField ] textFields?.forEach { $0.addTarget(self, action: #selector(editingDidBegin(_:)), for: .editingDidBegin) $0.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged) } let monthPickerView = UIPickerView() monthPickerView.tag = 0 monthPickerView.delegate = self monthPickerView.dataSource = self monthTextField.inputView = monthPickerView let yearPickerView = UIPickerView() yearPickerView.tag = 1 yearPickerView.delegate = self yearPickerView.dataSource = self yearTextField.inputView = yearPickerView let format = DateFormatter() format.dateFormat = "yy" let now = Date() let min = Int(format.string(from: now)) ?? 19 let max = min + 5 for year in min...max { years.append("\(year)") } } func focusFirstNumberField() { firstNumberTextField.becomeFirstResponder() } @objc private func editingChanged(_ textField: UITextField) { let limitCount: Int switch textField { case monthTextField, yearTextField: limitCount = 2 default: limitCount = 4 } if textField.text?.count == limitCount, let index = textFields?.firstIndex(of: textField)?.advanced(by: 1) { if index < textFields?.count ?? 6, textFields?[index].text?.count != limitCount { textFields?[index].becomeFirstResponder() } else { textField.resignFirstResponder() guard let first = firstNumberTextField.text, let second = secondNumberTextField.text, let third = thirdNumberTextField.text, let fourth = fourthNumberTextField.text, let month = monthTextField.text, let year = yearTextField.text else { return } let cardNumber = first + second + third + fourth cardCompanyImageView.image = CreditCardType.validate(cardNumber: cardNumber)?.image } } } @objc private func editingDidBegin(_ textField: UITextField) { textField.text = nil } } extension CreditCardView: UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { guard let type = PickerType(rawValue: pickerView.tag) else { return 0 } switch type { case .month: return months.count case .year: return years.count } } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { guard let type = PickerType(rawValue: pickerView.tag) else { return nil } switch type { case .month: return months[row] case .year: return years[row] } } } extension CreditCardView: UIPickerViewDelegate { func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { guard let type = PickerType(rawValue: pickerView.tag) else { return } switch type { case .month: monthTextField.text = months[row] monthTextField.sendActions(for: .editingChanged) case .year: yearTextField.text = years[row] yearTextField.sendActions(for: .editingChanged) } } }