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
parent 2cdb9900d4
commit d7410b7f60

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