fixeds for the datePicker
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
3ec982d45c
commit
77fbec8bed
@ -62,21 +62,6 @@ open class AlertViewController: UIViewController, Surfaceable {
|
|||||||
open func setup() {
|
open func setup() {
|
||||||
guard let dialog else { return }
|
guard let dialog else { return }
|
||||||
view.accessibilityElements = [dialog]
|
view.accessibilityElements = [dialog]
|
||||||
|
|
||||||
//left-right swipe
|
|
||||||
view.publisher(for: UISwipeGestureRecognizer().with{ $0.direction = .right })
|
|
||||||
.sink { [weak self] swipe in
|
|
||||||
guard let self, !UIAccessibility.isVoiceOverRunning else { return }
|
|
||||||
self.dismiss()
|
|
||||||
}.store(in: &subscribers)
|
|
||||||
|
|
||||||
//tapping in background
|
|
||||||
view.publisher(for: UITapGestureRecognizer().with{ $0.numberOfTapsRequired = 1 })
|
|
||||||
.sink { [weak self] swipe in
|
|
||||||
guard let self, !UIAccessibility.isVoiceOverRunning else { return }
|
|
||||||
self.dismiss()
|
|
||||||
}.store(in: &subscribers)
|
|
||||||
|
|
||||||
view.addSubview(dialog)
|
view.addSubview(dialog)
|
||||||
|
|
||||||
// Activate constraints
|
// Activate constraints
|
||||||
@ -90,6 +75,16 @@ open class AlertViewController: UIViewController, Surfaceable {
|
|||||||
dialog.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor, constant: -10)
|
dialog.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor, constant: -10)
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
|
guard let touch = touches.first else { return }
|
||||||
|
let location = touch.location(in: view)
|
||||||
|
if dialog.frame.contains(location) {
|
||||||
|
super.touchesBegan(touches, with: event)
|
||||||
|
} else {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// 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 func updateView() {
|
open func updateView() {
|
||||||
|
|||||||
@ -52,6 +52,15 @@ open class DatePicker: EntryFieldBase {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Popover/Alert Properties
|
// MARK: - Private Popover/Alert Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
/// View shown inline
|
||||||
|
internal var popoverOverlayView = UIView().with {
|
||||||
|
$0.backgroundColor = .clear
|
||||||
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/// use this to track touch events outside of the popover in the overlay
|
||||||
|
internal var popupOverlayTapGesture: AnyCancellable?
|
||||||
|
|
||||||
/// View shown inline
|
/// View shown inline
|
||||||
internal var popoverView: UIView!
|
internal var popoverView: UIView!
|
||||||
/// Size used for the popover
|
/// Size used for the popover
|
||||||
@ -147,6 +156,7 @@ open class DatePicker: EntryFieldBase {
|
|||||||
}
|
}
|
||||||
.store(in: &subscribers)
|
.store(in: &subscribers)
|
||||||
|
|
||||||
|
popoverOverlayView.isHidden = true
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func getFieldContainer() -> UIView {
|
open override func getFieldContainer() -> UIView {
|
||||||
@ -189,7 +199,7 @@ open class DatePicker: EntryFieldBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension DatePicker {
|
extension DatePicker {
|
||||||
|
|
||||||
private func showPopover() {
|
private func showPopover() {
|
||||||
guard let viewController = UIApplication.topViewController(), var parentView = viewController.view, !popoverVisible else {
|
guard let viewController = UIApplication.topViewController(), var parentView = viewController.view, !popoverVisible else {
|
||||||
hidePopoverView()
|
hidePopoverView()
|
||||||
@ -220,12 +230,12 @@ extension DatePicker {
|
|||||||
if let scrollView {
|
if let scrollView {
|
||||||
parentView = scrollView
|
parentView = scrollView
|
||||||
}
|
}
|
||||||
|
|
||||||
// see if you should use the popover or show an alert
|
// see if you should use the popover or show an alert
|
||||||
if let popoverOrigin = try? calculatePopoverPosition(relativeTo: containerView,
|
if let popoverOrigin = calculatePopoverPosition(relativeTo: containerView,
|
||||||
in: parentView,
|
in: parentView,
|
||||||
size: popoverViewSize,
|
size: popoverViewSize,
|
||||||
with: popoverSpacing) {
|
with: popoverSpacing) {
|
||||||
calendar.onChange = { [weak self] control in
|
calendar.onChange = { [weak self] control in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
selectedDate = control.selectedDate
|
selectedDate = control.selectedDate
|
||||||
@ -246,6 +256,16 @@ extension DatePicker {
|
|||||||
calendar.pinToSuperView()
|
calendar.pinToSuperView()
|
||||||
|
|
||||||
// add views
|
// add views
|
||||||
|
popoverOverlayView.isHidden = false
|
||||||
|
popupOverlayTapGesture = popoverOverlayView
|
||||||
|
.publisher(for: UITapGestureRecognizer())
|
||||||
|
.sink(receiveValue: { [weak self] gesture in
|
||||||
|
guard let self else { return }
|
||||||
|
gestureEventOccured(gesture, parentView: parentView)
|
||||||
|
})
|
||||||
|
|
||||||
|
parentView.addSubview(popoverOverlayView)
|
||||||
|
popoverOverlayView.pinToSuperView()
|
||||||
parentView.addSubview(popoverView)
|
parentView.addSubview(popoverView)
|
||||||
parentView.layoutIfNeeded()
|
parentView.layoutIfNeeded()
|
||||||
|
|
||||||
@ -302,6 +322,11 @@ extension DatePicker {
|
|||||||
topViewController?.dismiss(animated: true)
|
topViewController?.dismiss(animated: true)
|
||||||
topViewController = nil
|
topViewController = nil
|
||||||
} else {
|
} else {
|
||||||
|
popoverOverlayView.isHidden = true
|
||||||
|
popoverOverlayView.removeFromSuperview()
|
||||||
|
popupOverlayTapGesture?.cancel()
|
||||||
|
popupOverlayTapGesture = nil
|
||||||
|
|
||||||
UIView.animate(withDuration: 0.2,
|
UIView.animate(withDuration: 0.2,
|
||||||
animations: {[weak self] in
|
animations: {[weak self] in
|
||||||
guard let self, let popoverView else { return }
|
guard let self, let popoverView else { return }
|
||||||
@ -367,7 +392,7 @@ extension DatePicker {
|
|||||||
var availableSpaceBelow: CGFloat = 0.0
|
var availableSpaceBelow: CGFloat = 0.0
|
||||||
|
|
||||||
/// if the scrollView is set we want to change how we calculate the containerView's position
|
/// if the scrollView is set we want to change how we calculate the containerView's position
|
||||||
if var scrollView = parentView as? UIScrollView {
|
if let scrollView = parentView as? UIScrollView {
|
||||||
// Calculate vertical position and height
|
// Calculate vertical position and height
|
||||||
availableSpaceAbove = sourceFrameInParent.minY - scrollView.bounds.minY - spacing
|
availableSpaceAbove = sourceFrameInParent.minY - scrollView.bounds.minY - spacing
|
||||||
availableSpaceBelow = scrollView.bounds.maxY - sourceFrameInParent.maxY - spacing
|
availableSpaceBelow = scrollView.bounds.maxY - sourceFrameInParent.maxY - spacing
|
||||||
@ -408,4 +433,12 @@ extension DatePicker {
|
|||||||
|
|
||||||
return .init(x: popoverX, y: popoverY)
|
return .init(x: popoverX, y: popoverY)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func gestureEventOccured(_ gesture: UIGestureRecognizer, parentView: UIView) {
|
||||||
|
guard let popoverView, popoverVisible else { return }
|
||||||
|
let location = gesture.location(in: parentView)
|
||||||
|
if !popoverView.frame.contains(location) {
|
||||||
|
hidePopoverView()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user