Боковое меню не работает должным образом на mapView в Swift - PullRequest
0 голосов
/ 23 мая 2019

Я создаю приложение в swift, которое получает местоположение пользователя и сохраняет его для доступа позже. У меня проблема с пользовательским интерфейсом. Я сделал левое меню на mapView. Когда я хочу сдвинуть, чтобы открыть его, карта скользит, но боковое меню не открывается. Кроме того, у меня есть BarButtonItem на верхней панели, и если я скользю оттуда, открывается боковое меню. Я имею в виду, я думаю, что проблема заключается в скольжении с картой, и все остальное не работает должным образом.

Я выдвигаю его из пункта кнопки бара на этой картинке.

enter image description here

enter image description here

override func viewDidLoad() {
    super.viewDidLoad()

    centerViewController = UIStoryboard.userMapViewController()
    centerViewController.delegate = self

    // wrap the centerViewController in a navigation controller, so we can push views to it
    // and display bar button items in the navigation bar
    centerNavigationController = UINavigationController(rootViewController: centerViewController)
    view.addSubview(centerNavigationController.view)
    addChild(centerNavigationController)

    centerNavigationController.didMove(toParent: self)

    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
    centerNavigationController.view.addGestureRecognizer(panGestureRecognizer)
}

func toggleLeftPanel() {
    let notAlreadyExpanded = (currentState != .leftPanelExpanded)

    if notAlreadyExpanded {
        addLeftPanelViewController()
    }

    animateLeftPanel(shouldExpand: notAlreadyExpanded)
}

func addLeftPanelViewController() {
    guard leftViewController == nil else { return }

    if let vc = UIStoryboard.leftViewController() {
        addChildSidePanelController(vc)
        leftViewController = vc
    }
}

func animateLeftPanel(shouldExpand: Bool) {
    if shouldExpand {
        currentState = .leftPanelExpanded
        animateCenterPanelXPosition(
            targetPosition: centerNavigationController.view.frame.width - centerPanelExpandedOffset)
    } else {
        animateCenterPanelXPosition(targetPosition: 0) { _ in
            self.currentState = .leftPanelCollapsed
            self.leftViewController?.view.removeFromSuperview()
            self.leftViewController = nil
        }
    }
}

extension ContainerViewController: UIGestureRecognizerDelegate {
@objc func handlePanGesture(_ recognizer: UIPanGestureRecognizer) {
    let gestureIsDraggingFromLeftToRight = (recognizer.velocity(in: view).x > 0)

    switch recognizer.state {
    case .began:
        if currentState == .leftPanelCollapsed {
            if gestureIsDraggingFromLeftToRight {
                addLeftPanelViewController()
            }
            showShadowForCenterViewController(true)
        }

    case .changed:
        if let rview = recognizer.view {
            rview.center.x = rview.center.x + recognizer.translation(in: view).x
            recognizer.setTranslation(CGPoint.zero, in: view)
        }

    case .ended:
        if let _ = leftViewController,
            let rview = recognizer.view {
            // animate the side panel open or closed based on whether the view
            // has moved more or less than halfway
            let hasMovedGreaterThanHalfway = rview.center.x > view.bounds.size.width
            animateLeftPanel(shouldExpand: hasMovedGreaterThanHalfway)
        }
    default:
        break
    }
}

1 Ответ

0 голосов
/ 23 мая 2019

Это распространенная проблема - представление карты будет «поглощать» все сенсорные события, а это значит, что ваш распознаватель жестов никогда не сработает.

Решение заключается в использовании UIScreenEdgePanGestureRecognizer, полное решение подробно описано ниже:

https://stackoverflow.com/a/24887059

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...