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