2

Trying to duplicate Apple Maps feature, with a bottom sheet overlay.

I've been able create the custom UIPresentationController and get the bottom sheet to appear, but now the bottom sheet seems to be blocking all of the gestures of the parent/presenting view controller.

Here's a sim screenshot:

enter image description here

The Map Annotations, Menu Button (top right) and the map itself do not respond to gestures, taps pans or otherwise. The search bar and segmentedControl tabs work fine.

Here's my UIPresentationController and Delegate:

class MapDrawerPresentationManager: NSObject {

}

extension MapDrawerPresentationManager: UIViewControllerTransitioningDelegate {
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
    let presentationController = MapDrawerPresentationController(presentedViewController: presented, presenting: presenting)
    return presentationController
    }

}

class MapDrawerPresentationController: UIPresentationController {

    var topGap: CGFloat = 88

    override init(presentedViewController: UIViewController,
     presenting presentingViewController: UIViewController?) {

      super.init(presentedViewController: presentedViewController,
             presenting: presentingViewController)
    }

    override public var frameOfPresentedViewInContainerView: CGRect {
     return CGRect(
         origin: CGPoint(x: 0, y: self.containerView!.frame.height/2),
         size: CGSize(width: self.containerView!.frame.width, // width of parent
                  height: self.containerView!.frame.height-self.topGap))
     }

    override public func containerViewWillLayoutSubviews() {
        super.containerViewWillLayoutSubviews()
        guard let presentedView = self.presentedView else { return }
    
        presentedView.layer.masksToBounds = true
    }

    override public func containerViewDidLayoutSubviews() {
        super.containerViewDidLayoutSubviews()
        guard let presenterView = self.containerView else { return }
        guard let presentedView = self.presentedView else { return }
    
   
        presentedView.frame = self.frameOfPresentedViewInContainerView
        presentedView.frame.origin.x = (presenterView.frame.width - presentedView.frame.width)
        presentedView.center = CGPoint(x: presentedView.center.x, y: presenterView.center.y * 2)
    
    }

And how I'm presenting/initializing the views from my Coordinator

lazy var presentationDelegate = MapDrawerPresentationManager()

func start() {

    let mapViewController = MapViewController(nibName: nil, bundle: nil)
    
    let drawerVC = MapPanModalViewController(nibName: nil, bundle: nil)
    drawerVC.transitioningDelegate = mapViewController.presentationDelegate
    drawerVC.modalPresentationStyle = .custom

    presenter.pushViewController(mapViewController, animated: false)
    presenter.present(drawerVC, animated: false)
}

I've tried returing true from "shouldRecognizeSimultaneouslyWith" from the UIGestureRecognizerDelegate... but I don't know how to get access to the built in gestures for the MapView and UIButton in order to set the delegate.

How do I get the gestures/taps from the mapKit and my menu button to work?

Thank you,

Iskeraet
  • 731
  • 1
  • 6
  • 12

0 Answers0