refactored date picker a popover
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
e667054eb6
commit
28d8161d09
@ -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
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -31,9 +31,7 @@ open class DatePicker: EntryFieldBase {
|
|||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
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
|
||||||
@ -128,19 +122,12 @@ open class DatePicker: EntryFieldBase {
|
|||||||
controlStackView.addArrangedSubview(selectedDateLabel)
|
controlStackView.addArrangedSubview(selectedDateLabel)
|
||||||
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func dateChanged(_ sender: UIDatePicker) {
|
internal func didSelectDate(_ controller: DatePickerPopoverViewController, date: Date) {
|
||||||
selectedDate = sender.date
|
selectedDate = date
|
||||||
|
controller.dismiss(animated: true)
|
||||||
sendActions(for: .valueChanged)
|
sendActions(for: .valueChanged)
|
||||||
togglePicker()
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
delegate?.didSelectDate(self, date: sender.date)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user