From bc4a2def42865dd992d507ee93554ea51eab9435 Mon Sep 17 00:00:00 2001 From: Shin Yamamoto Date: Thu, 20 Dec 2018 11:14:49 +0900 Subject: [PATCH] Add FloatingPanelControllerDelegate.floatingPanel(_:shouldRecognizeSimultaneouslyWith:) --- Examples/Samples/Sources/Base.lproj/Main.storyboard | 1 + Examples/Samples/Sources/ViewController.swift | 10 ++++++++++ Framework/Sources/FloatingPanel.swift | 11 ++++++++++- Framework/Sources/FloatingPanelController.swift | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Examples/Samples/Sources/Base.lproj/Main.storyboard b/Examples/Samples/Sources/Base.lproj/Main.storyboard index 59c936d..7e0b345 100644 --- a/Examples/Samples/Sources/Base.lproj/Main.storyboard +++ b/Examples/Samples/Sources/Base.lproj/Main.storyboard @@ -372,6 +372,7 @@ + diff --git a/Examples/Samples/Sources/ViewController.swift b/Examples/Samples/Sources/ViewController.swift index 2022d95..35159b7 100644 --- a/Examples/Samples/Sources/ViewController.swift +++ b/Examples/Samples/Sources/ViewController.swift @@ -198,6 +198,15 @@ class SampleListViewController: UIViewController, UITableViewDataSource, UITable } } + func floatingPanel(_ vc: FloatingPanelController, shouldRecognizeSimultaneouslyWith gestureRecognizer: UIGestureRecognizer) -> Bool { + switch currentMenu { + case .showNestedScrollView: + return (vc.contentViewController as? NestedScrollViewController)?.nestedScrollView.gestureRecognizers?.contains(gestureRecognizer) ?? false + default: + return false + } + } + var initialPosition: FloatingPanelPosition { return .half } @@ -265,6 +274,7 @@ class ModalPanelLayout: FloatingPanelIntrinsicLayout { class NestedScrollViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var nestedScrollView: UIScrollView! @IBAction func longPressed(_ sender: Any) { print("LongPressed!") diff --git a/Framework/Sources/FloatingPanel.swift b/Framework/Sources/FloatingPanel.swift index 4638c1d..dff333d 100644 --- a/Framework/Sources/FloatingPanel.swift +++ b/Framework/Sources/FloatingPanel.swift @@ -180,6 +180,10 @@ class FloatingPanel: NSObject, UIGestureRecognizerDelegate, UIScrollViewDelegate /* log.debug("shouldRecognizeSimultaneouslyWith", otherGestureRecognizer) */ + if viewcontroller.delegate?.floatingPanel(viewcontroller, shouldRecognizeSimultaneouslyWith: otherGestureRecognizer) ?? false { + return true + } + // all gestures of the tracking scroll view should be recognized in parallel // and handle them in self.handle(panGesture:) return scrollView?.gestureRecognizers?.contains(otherGestureRecognizer) ?? false @@ -194,7 +198,7 @@ class FloatingPanel: NSObject, UIGestureRecognizerDelegate, UIScrollViewDelegate public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { guard gestureRecognizer == panGesture else { return false } - log.debug("shouldRequireFailureOf", otherGestureRecognizer) + /* log.debug("shouldRequireFailureOf", otherGestureRecognizer) */ // Should begin the pan gesture without waiting for the tracking scroll view's gestures. // `scrollView.gestureRecognizers` can contains the following gestures @@ -212,6 +216,11 @@ class FloatingPanel: NSObject, UIGestureRecognizerDelegate, UIScrollViewDelegate } } + if viewcontroller.delegate?.floatingPanel(viewcontroller, shouldRecognizeSimultaneouslyWith: otherGestureRecognizer) ?? false { + return false + } + + switch otherGestureRecognizer { case is UIPanGestureRecognizer, is UISwipeGestureRecognizer, diff --git a/Framework/Sources/FloatingPanelController.swift b/Framework/Sources/FloatingPanelController.swift index 810311c..b2eb585 100644 --- a/Framework/Sources/FloatingPanelController.swift +++ b/Framework/Sources/FloatingPanelController.swift @@ -27,6 +27,8 @@ public protocol FloatingPanelControllerDelegate: class { func floatingPanelDidEndDraggingToRemove(_ vc: FloatingPanelController, withVelocity velocity: CGPoint) // called when its views are removed from a parent view controller func floatingPanelDidEndRemove(_ vc: FloatingPanelController) + + func floatingPanel(_ vc: FloatingPanelController, shouldRecognizeSimultaneouslyWith gestureRecognizer: UIGestureRecognizer) -> Bool } public extension FloatingPanelControllerDelegate { @@ -45,6 +47,8 @@ public extension FloatingPanelControllerDelegate { func floatingPanelDidEndDraggingToRemove(_ vc: FloatingPanelController, withVelocity velocity: CGPoint) {} func floatingPanelDidEndRemove(_ vc: FloatingPanelController) {} + + func floatingPanel(_ vc: FloatingPanelController, shouldRecognizeSimultaneouslyWith gestureRecognizer: UIGestureRecognizer) -> Bool { return false } } public enum FloatingPanelPosition: Int, CaseIterable {