Dynamically disables interactive back gesture when viewing source header image

Only disables gesture if touches are within headerContainerView to ensure back gesture works as expected majority of the time.
This commit is contained in:
Riley Testut
2023-04-04 17:06:58 -05:00
committed by Magesh K
parent 9c7d222a9e
commit b2dcdc02c7

View File

@@ -20,7 +20,8 @@ protocol ScrollableContentViewController: UIViewController
class HeaderContentViewController<Header: UIView, Content: ScrollableContentViewController> : UIViewController, class HeaderContentViewController<Header: UIView, Content: ScrollableContentViewController> : UIViewController,
UIAdaptivePresentationControllerDelegate, UIAdaptivePresentationControllerDelegate,
UIScrollViewDelegate UIScrollViewDelegate,
UIGestureRecognizerDelegate
{ {
var tintColor: UIColor? { var tintColor: UIColor? {
didSet { didSet {
@@ -48,6 +49,8 @@ class HeaderContentViewController<Header: UIView, Content: ScrollableContentView
private var backgroundBlurView: UIVisualEffectView! private var backgroundBlurView: UIVisualEffectView!
private var contentViewControllerShadowView: UIView! private var contentViewControllerShadowView: UIView!
private var ignoreBackGestureRecognizer: UIPanGestureRecognizer!
private var blurAnimator: UIViewPropertyAnimator? private var blurAnimator: UIViewPropertyAnimator?
private var navigationBarAnimator: UIViewPropertyAnimator? private var navigationBarAnimator: UIViewPropertyAnimator?
private var contentSizeObservation: NSKeyValueObservation? private var contentSizeObservation: NSKeyValueObservation?
@@ -117,6 +120,11 @@ class HeaderContentViewController<Header: UIView, Content: ScrollableContentView
self.headerContainerView = UIView(frame: .zero) self.headerContainerView = UIView(frame: .zero)
self.view.addSubview(self.headerContainerView, pinningEdgesWith: .zero) self.view.addSubview(self.headerContainerView, pinningEdgesWith: .zero)
self.ignoreBackGestureRecognizer = UIPanGestureRecognizer(target: self, action: nil)
self.ignoreBackGestureRecognizer.delegate = self
self.headerContainerView.addGestureRecognizer(self.ignoreBackGestureRecognizer)
self.navigationController?.interactivePopGestureRecognizer?.require(toFail: self.ignoreBackGestureRecognizer) // So we can disable back gesture when viewing header.
self.headerScrollView = UIScrollView(frame: .zero) self.headerScrollView = UIScrollView(frame: .zero)
self.headerScrollView.delegate = self self.headerScrollView.delegate = self
self.headerScrollView.isPagingEnabled = true self.headerScrollView.isPagingEnabled = true
@@ -420,6 +428,20 @@ class HeaderContentViewController<Header: UIView, Content: ScrollableContentView
default: break default: break
} }
} }
//MARK: UIGestureRecognizerDelegate
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
{
// Ignore interactive back gesture when viewing header, which means returning `true` to enable ignoreBackGestureRecognizer.
let disableBackGesture = self.isViewingHeader
return disableBackGesture
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
{
return true
}
} }
private extension HeaderContentViewController private extension HeaderContentViewController