Ios 如何阻止MapView上的任何交互?

Ios 如何阻止MapView上的任何交互?,ios,swift,viewcontroller,Ios,Swift,Viewcontroller,因此,我正在设计一个幻灯片导航面板 一切正常。现在我想进一步研究一些用户体验问题。 这就是我的应用程序现在的样子。但我仍然可以操作MapView。我的目标是做两件事: 1) 阻止与MapView的所有交互,例如缩放和移动 2) 关闭导航面板,同时单击带有地图的viewController 控制这两个控制器的主文件是containerViewController。以下是它的源代码: import UIKit import QuartzCore enum SlideOutState {

因此,我正在设计一个幻灯片导航面板

一切正常。现在我想进一步研究一些用户体验问题。 这就是我的应用程序现在的样子。但我仍然可以操作MapView。我的目标是做两件事:

1) 阻止与MapView的所有交互,例如缩放和移动

2) 关闭导航面板,同时单击带有地图的viewController

控制这两个控制器的主文件是containerViewController。以下是它的源代码:

    import UIKit
import QuartzCore

enum SlideOutState {
    case BothCollapsed
    case LeftPanelExpanded
}

class ContainerViewController: UIViewController {

    var centerNavigationController: UINavigationController!
    var centerViewController: ViewController!

    var currentState: SlideOutState = .BothCollapsed {
        didSet {
            let shouldShowShadow = currentState != .BothCollapsed
            showShadowForCenterViewController(shouldShowShadow)
        }
    }

    var leftViewController: SidePanelViewController?

  override func viewDidLoad() {
    super.viewDidLoad()

    centerViewController = UIStoryboard.centerViewController()
    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)
    addChildViewController(centerNavigationController)

    centerNavigationController.didMoveToParentViewController(self)

  }

}

let centerPanelExpandedOffset: CGFloat = 60

extension ContainerViewController: CenterViewControllerDelegate {

    func toggleLeftPanel() {

        let notAlreadyExpanded = (currentState != .LeftPanelExpanded)

        if notAlreadyExpanded {
            addLeftPanelViewController()
        }

        animateLeftPanel(shouldExpand: notAlreadyExpanded)

    }



    func addLeftPanelViewController() {

        if (leftViewController == nil) {
            leftViewController = UIStoryboard.leftViewController()
            leftViewController!.categories = Category.allCats()

            addChildSidePanelController(leftViewController!)
        }

    }

    func addChildSidePanelController(sidePanelController: SidePanelViewController) {
        view.insertSubview(sidePanelController.view, atIndex: 0)

        addChildViewController(sidePanelController)
        sidePanelController.didMoveToParentViewController(self)
    }


    func animateLeftPanel(shouldExpand shouldExpand: Bool) {

        if (shouldExpand) {
            currentState = .LeftPanelExpanded

            animateCenterPanelXPosition(targetPosition: CGRectGetWidth(centerNavigationController.view.frame) - centerPanelExpandedOffset)
        } else {
            animateCenterPanelXPosition(targetPosition: 0) { finished in
                self.currentState = .BothCollapsed

                self.leftViewController!.view.removeFromSuperview()
                self.leftViewController = nil;
            }
        }

    }

    func animateCenterPanelXPosition(targetPosition targetPosition: CGFloat, completion: ((Bool) -> Void)! = nil) {
        UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .CurveEaseInOut, animations: {
            self.centerNavigationController.view.frame.origin.x = targetPosition
            }, completion: completion)
    }

    func showShadowForCenterViewController(shouldShowShadow: Bool) {
        if (shouldShowShadow) {
            centerNavigationController.view.layer.shadowOpacity = 0.8
        } else {
            centerNavigationController.view.layer.shadowOpacity = 0.0
        }
    }

}


private extension UIStoryboard {
  class func mainStoryboard() -> UIStoryboard { return UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) }

  class func leftViewController() -> SidePanelViewController? {
    return mainStoryboard().instantiateViewControllerWithIdentifier("LeftViewController") as? SidePanelViewController
  }


  class func centerViewController() -> ViewController? {
    return mainStoryboard().instantiateViewControllerWithIdentifier("CenterViewController") as? ViewController
  }

}
我的想法是创建代表活动侧面板的变量,并编写一个函数,以解决我的问题:

我看到这样的情况:

func blockCenterView() {

    let AlreadyExpanded = (currentState = .LeftPanelExpanded)

    if AlreadyExpanded {
        //no idea what to write here
    }
}

我说的对吗,或者存在其他解决该问题的变体?

在您希望停止与mapView交互的任何位置添加此代码

mapView.userInteractionEnabled = false
要使其恢复

mapView.userInteractionEnabled = true
注意:mapView是MKMapView的一个实例

PS

SWRevealViewController

资料来源:

逐步教程:

这就是我使用这个很棒的框架所能创建的


应用程序链接:

尝试将以下属性设置为
false

mapView.zoomEnabled = false
mapView.scrollEnabled = false
mapView.userInteraction = false

还要检查界面生成器中的用户交互:

userInteraction
MKMapView
上不起作用。很抱歉,它的
userInteractionEnabled
问题是,与其他
UIView
不同,
userInteractionEnabled
不会阻止
MKMapView
上的所有用户交互。请尝试添加
self.mapView.userInteractionEnabled
,因为我能够实现它