找到 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.
        }
    }
}

我讨厌金丝雀和信号量,但它确实有效。

如果区域回调以异步方式发生,这有一个明显的缺点,那就是无法正常工作。以内联回调为前提,因此区域设置完成后金丝雀已被清除。