微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用UIPresentationController时如何允许父视图的手势仍然有效/不被禁用? 复制Apple Maps功能

如何解决使用UIPresentationController时如何允许父视图的手势仍然有效/不被禁用? 复制Apple Maps功能

尝试复制Apple Maps功能,并覆盖底部

我已经能够创建自定义UIPresentationController并显示底部页面,但是现在底部页面似乎阻止了父/呈现视图控制器的所有手势。

这是一个模拟屏幕截图:

enter image description here

地图注释,菜单按钮(右上)和地图本身不响应手势,轻按平移或其他方式。搜索栏和segmentedControl选项卡工作正常。

这是我的UIPresentationController和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)
    
    }

以及我如何通过协调器呈现/初始化视图

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)
}

我曾尝试从UIGestureRecognizerDelegate的“ shouldRecognizeSimultaneouslyWith”中恢复true,但是我不知道如何访问MapView和UIButton的内置手势以设置委托。

如何从mapKit和菜单按钮获取手势/轻击键?

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。