refactored date picker a popover

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-05-13 13:12:07 -05:00
parent e667054eb6
commit 28d8161d09

View File

@ -5,7 +5,7 @@ import Combine
/// A dropdown select is an expandable menu of predefined options that allows a customer to make a single selection. /// A dropdown select is an expandable menu of predefined options that allows a customer to make a single selection.
@objc(VDSDatePicker) @objc(VDSDatePicker)
open class DatePicker: EntryFieldBase { open class DatePicker: EntryFieldBase, DatePickerPopoverViewControllerDelegate, UIPopoverPresentationControllerDelegate {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
//-------------------------------------------------- //--------------------------------------------------
@ -32,8 +32,6 @@ open class DatePicker: EntryFieldBase {
//-------------------------------------------------- //--------------------------------------------------
internal var minWidthDefault = 186.0 internal var minWidthDefault = 186.0
internal let picker = UIDatePicker()
internal var bottomStackView: UIStackView = { internal var bottomStackView: UIStackView = {
return UIStackView().with { return UIStackView().with {
$0.translatesAutoresizingMaskIntoConstraints = false $0.translatesAutoresizingMaskIntoConstraints = false
@ -103,10 +101,6 @@ open class DatePicker: EntryFieldBase {
selectedDateLabel.textColorConfiguration = primaryColorConfiguration.eraseToAnyColorable() selectedDateLabel.textColorConfiguration = primaryColorConfiguration.eraseToAnyColorable()
// setup the calendar // setup the calendar
picker.datePickerMode = .date
picker.preferredDatePickerStyle = .inline
picker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
picker.isHidden = true
// tap gesture // tap gesture
fieldStackView fieldStackView
@ -129,18 +123,11 @@ open class DatePicker: EntryFieldBase {
return controlStackView return controlStackView
} }
open override func getBottomContainer() -> UIView {
bottomStackView.addArrangedSubview(bottomContainerStackView)
bottomStackView.addArrangedSubview(picker)
return bottomStackView
}
/// Used to make changes to the View based off a change events or from local properties. /// Used to make changes to the View based off a change events or from local properties.
open override func updateView() { open override func updateView() {
super.updateView() super.updateView()
if let selectedDate { if let selectedDate {
picker.date = selectedDate
formatDate(selectedDate) formatDate(selectedDate)
} }
@ -162,13 +149,69 @@ open class DatePicker: EntryFieldBase {
} }
internal func togglePicker() { internal func togglePicker() {
picker.isHidden = !picker.isHidden let calendarVC = DatePickerPopoverViewController(calendar: Calendar(identifier: .gregorian), delegate: self)
bottomContainerStackView.isHidden = !bottomContainerStackView.isHidden calendarVC.modalPresentationStyle = .popover
calendarVC.selectedDate = selectedDate ?? Date()
if let popoverController = calendarVC.popoverPresentationController {
popoverController.delegate = self
popoverController.sourceView = containerView
popoverController.sourceRect = containerView.bounds
popoverController.permittedArrowDirections = .any
}
if let viewController = UIApplication.topViewController() {
viewController.present(calendarVC, animated: true, completion: nil)
}
}
internal func didSelectDate(_ controller: DatePickerPopoverViewController, date: Date) {
selectedDate = date
controller.dismiss(animated: true)
sendActions(for: .valueChanged)
}
public func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
}
protocol DatePickerPopoverViewControllerDelegate: NSObject {
func didSelectDate(_ controller: DatePickerPopoverViewController, date: Date)
}
class DatePickerPopoverViewController: UIViewController {
private let picker = UIDatePicker()
weak var delegate: DatePickerPopoverViewControllerDelegate?
init(calendar: Calendar, delegate: DatePickerPopoverViewControllerDelegate?) {
self.delegate = delegate
super.init(nibName: nil, bundle: nil)
picker.datePickerMode = .date
picker.preferredDatePickerStyle = .inline
picker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
}
var selectedDate: Date = Date() {
didSet {
picker.date = selectedDate
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = picker
view.backgroundColor = .white
}
override func viewDidLoad() {
super.viewDidLoad()
preferredContentSize = CGSize(width: 300, height: 400) // Adjust as needed
} }
@objc private func dateChanged(_ sender: UIDatePicker) { @objc private func dateChanged(_ sender: UIDatePicker) {
selectedDate = sender.date delegate?.didSelectDate(self, date: sender.date)
sendActions(for: .valueChanged)
togglePicker()
} }
} }