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];
のようにしてやるだけです。