找到 MKMapView 的最大缩放级别,并知道何时达到它
Finding the maximum zoom level of an MKMapView, and Knowing When I've Reached It
我看过很多关于 设置 最大缩放级别的内容,但不知道如何 得到它.
这是交易。我正在对集群注释进行“向下钻取”UI。虽然可以缩放地图,但点击集群只会使地图在集群上居中,并将跨度减半。
当它走到尽头时,还有一个簇,但是,我希望能够显示一个popover/callout,表示剩余簇的内容。
我无法检查缩放以了解我计划设置的新区域是否会“拍摄”。
我知道,一旦达到最大缩放,mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool)
将不再被调用,但这意味着我需要玩弄上下文,并进行相当复杂的舞蹈。
有没有简单的方法来检查 MKMapView,看看它是否处于最大缩放?
好的,那么没有人要了。
这是我的做法。笨重,但它有效。
首先,我设置了一个私有实例属性作为金丝雀:
private var _lastClusterTapped: Bool = false
接下来,我设置了一个简单的委托回调来清除金丝雀:
func mapView(_: MKMapView, regionWillChangeAnimated: Bool) {
_lastClusterTapped = false
}
然后,在处理集群点击的代码中,我这样做了:
func tappedOnClusterAnnotation(mapView inMapView: MKMapView, annotationView inAnnotationView: MKAnnotationView) {
// We attempt to zoom in by a certain amount. We do this by dividing the span.
if let coords = inAnnotationView.annotation?.coordinate,
var region = inMapView?.region {
// The new region will be half the size of the original map region.
region.span.latitudeDelta /= 2.0
region.span.longitudeDelta /= 2.0
region.center = coords // The new region will center on the annotation.
_lastClusterTapped = true
inMapView?.setRegion(region, animated: true)
// If the callback did not happen (canary is still alive), then we assume we are maxed out, and call the handler.
if _lastClusterTapped {
// Do whatever we do, when a "locked" annotation is tapped.
}
}
}
我讨厌金丝雀和信号量,但它确实有效。
如果区域回调以异步方式发生,这有一个明显的缺点,那就是无法正常工作。以内联回调为前提,因此区域设置完成后金丝雀已被清除。
我看过很多关于 设置 最大缩放级别的内容,但不知道如何 得到它.
这是交易。我正在对集群注释进行“向下钻取”UI。虽然可以缩放地图,但点击集群只会使地图在集群上居中,并将跨度减半。
当它走到尽头时,还有一个簇,但是,我希望能够显示一个popover/callout,表示剩余簇的内容。
我无法检查缩放以了解我计划设置的新区域是否会“拍摄”。
我知道,一旦达到最大缩放,mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool)
将不再被调用,但这意味着我需要玩弄上下文,并进行相当复杂的舞蹈。
有没有简单的方法来检查 MKMapView,看看它是否处于最大缩放?
好的,那么没有人要了。
这是我的做法。笨重,但它有效。
首先,我设置了一个私有实例属性作为金丝雀:
private var _lastClusterTapped: Bool = false
接下来,我设置了一个简单的委托回调来清除金丝雀:
func mapView(_: MKMapView, regionWillChangeAnimated: Bool) {
_lastClusterTapped = false
}
然后,在处理集群点击的代码中,我这样做了:
func tappedOnClusterAnnotation(mapView inMapView: MKMapView, annotationView inAnnotationView: MKAnnotationView) {
// We attempt to zoom in by a certain amount. We do this by dividing the span.
if let coords = inAnnotationView.annotation?.coordinate,
var region = inMapView?.region {
// The new region will be half the size of the original map region.
region.span.latitudeDelta /= 2.0
region.span.longitudeDelta /= 2.0
region.center = coords // The new region will center on the annotation.
_lastClusterTapped = true
inMapView?.setRegion(region, animated: true)
// If the callback did not happen (canary is still alive), then we assume we are maxed out, and call the handler.
if _lastClusterTapped {
// Do whatever we do, when a "locked" annotation is tapped.
}
}
}
我讨厌金丝雀和信号量,但它确实有效。
如果区域回调以异步方式发生,这有一个明显的缺点,那就是无法正常工作。以内联回调为前提,因此区域设置完成后金丝雀已被清除。