iOSのMKMapでズームレベルを取得して段階的にズームアウトさせる

MKMapでズームアウトボタンを実装したかったんですが、 latitudeDeltaとかlongitudeDeltaとかdegreeで渡す必要があって、 一段ずつズームアウトするときはどのくらいのdeltaにすればええねん('_`) という問題。

Set the Zoom Level of an MKMapView に正解に近いものがあったんですが、ズームアウトボタンを実装しつつも、手でピンチイン・アウト可能な状態を作るためには、 現在のズームレベルを取得する必要があります。(現在のズームレベルがわからないと新しいズームレベルを渡しようがないので・・)

ということで、MKMapView+ZoomLevelに追加で少し実装しました。基本はリンク先でやっていることを逆順にたどってるだけです。

- (NSUInteger)getCurrentZoomLevel {
    // get longitude of right edge and left edge;
    CLLocationDegrees longitudeMax = self.region.center.longitude + self.region.span.longitudeDelta /2.0;
    CLLocationDegrees longitudeMin = self.region.center.longitude - self.region.span.longitudeDelta /2.0;
    
    // calc get longitude delta in pixel
    double longitudeMaxInPixel = [self longitudeToPixelSpaceX:longitudeMax];
    double longitudeMinInPixel = [self longitudeToPixelSpaceX:longitudeMin];
    double scaledMapWidth = longitudeMaxInPixel - longitudeMinInPixel;
    
    // calc zoom scale
    double mapSizeInPixels = self.bounds.size.width;
    double zoomScale = scaledMapWidth / mapSizeInPixels;
    NSUInteger zoomLevel = 20 - log2(zoomScale);

    return (zoomLevel > 0)? zoomLevel : 0;
}

あとは

    NSUInteger zoomLevel = (int)[_mapView getCurrentZoomLevel];
    NSUInteger newZoomLevel = (zoomLevel > 1)? zoomLevel-1 : 0;
    
    [_mapView setCenterCoordinate:_mapView.region.center zoomLevel:newZoomLevel animated:YES];

のようにしてやるだけです。