【发布时间】: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