【问题标题】:How do I intercept mapview panning and zooming (Swift 4)如何拦截地图视图的平移和缩放(Swift 4)
【发布时间】:2019-08-30 06:58:14
【问题描述】:

我正在尝试限制地图视图的平移和缩放,以保持在预定义的最大和最小相机高度以及边界框的四个角内。

The solutions proposed here,允许用户在区域外平移,然后使用regionDidChangeAnimated 将它们平移回预定义的范围内。

我想知道是否有可能从一开始就不允许用户平移到边界之外。例如,我可以拦截平移/缩放手势并决定是否让它们继续吗?

我想我正在寻找类似以下伪代码的东西:

func blockMapViewPanEvent(_ mapView: MKMapView){
    return mapView.visibleMapRect.isContainedWithin(topLeft, bottomRight)
}

我知道 MapBox 的 Swift SDK 实现了这一点,所以我想这是可能的。我可以用普通的 MapKit 做到这一点吗?

为清晰而编辑:

我想限制平移和缩放,以便用户可以在在边界框内随意平移和缩放。例如,如果边界框是德国,我希望用户能够在德国内平移和缩放,但他们永远看不到西班牙,因为西班牙在德国的边界框之外。

我不想禁用地图视图上的所有用户交互。

【问题讨论】:

  • @DaniSpringer 我根本没有以编程方式更新地图位置。我想我正在尝试弄清楚如何完全按照您的描述进行操作:拦截锅,检查新位置,如果不符合某些标准则忽略它。感谢您的帮助!
  • @DaniSpringer 我在问题中引用了第一个链接,并说明了这个问题与那个问题有何不同,以及那里提供的答案。具体来说:“这里提出的解决方案,允许用户在区域外平移,然后使用regionDidChangeAnimated 将它们平移回预定义的范围内。我想知道是否有可能永远不允许用户首先平移到边界之外。”
  • 也许您可以调整该代码,通过将“检查是否超出区域,如果是,则返回”的行更改为“检查 pan 的新位置是否在区域之外,如果是,请忽略平移手势”。平移手势的工作方式是手机检测移动(手势)并将其数据提供给应用程序。所以应用程序可以处理这个问题,如果提供的数据显示将元素更新到的新位置(在本例中为地图)超出了某个限制(或多或少),您可以对此采取一些措施,例如:完全忽略它,并且不更新元素的位置。
  • 我将它用于可拖动的文本字段:@objc func myFunc(gesture: UIPanGestureRecognizer) { self.view.bringSubviewToFront(myTextField) let translation = gesture.translation(in: self.view) myTextFieldXConstraint.constant = myTextFieldXConstraint.constant + translation.x myTextFieldYConstraint.constant = myTextFieldYConstraint.constant + translation.y myTextField.center = CGPoint(x: myTextField.center.x + translation.x, y: myTextField.center.y + translation.y) gesture.setTranslation(CGPoint.zero, in: self.view) }

标签: ios swift mapkit mkmapview uigesturerecognizer


【解决方案1】:

如果我对您的理解正确,您希望禁用地图中的用户交互。

以下是地图视图中可用的几个选项。这些可能对你有帮助

mapView.zoomEnabled = false
mapView.scrollEnabled = false
mapView.userInteractionEnabled = false

如果您对这些有疑问,您可以简单地在地图视图上放置一个透明视图

【讨论】:

  • 这不是我所追求的。我希望用户能够在特定区域内进行平移和缩放。他们不应该能够在该区域之外平移/缩放。为了清楚起见,我已经编辑了问题。
  • 我认为问题在于如何允许平移和缩放,但只能在所需区域内。
【解决方案2】:

MapKit 现在可以在 iOS 13 中实现这一点

您可以通过以下方式限制平移:

let boundaryRegion = MKCoordinateRegion(...) // the region you want to restrict
let cameraBoundary = CameraBoundary(region: boundaryRegion)
mapView.setCameraBoundary(cameraBoundary: cameraBoundary, animated: true)

并通过以下方式防止用户放大到您感兴趣的区域之外: 让 zoomRange = CameraZoomRange(minCenterCoordinateDistance: 100, 最大中心坐标距离:500) mapView.setCameraZoomRange(zoomRange, 动画: true)

您可以在WWDC 2019 video at 2378 seconds 中清楚地看到一些限制。

参考文献

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2010-10-19
    • 2016-07-22
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多