MKMapViewのzoomの上限下限を設定したいが上手くいかず諦めた話


MKMapViewのzoomには上限、下限の設定項目がありません。

そこで上限(や下限)を超えると、上限(下限)までアニメーションで戻してやる手法でみなさん上限、下限を付けているみたいです。

具体的には、
1. google map SDKにあるように、MKMapViewをzoomレベルを指定して変更できるように、MKMapViewを拡張します。
以下に先人のコードがあります。
jdp-global/MKMapViewZoom · GitHub
2. 更に、MKMapViewの現在のzoomレベルを取得できるように、以下のやりとりにあるようにgetZoomLevel的な拡張を加えます。
iphone – Is there way to limit MKMapView maximum zoom level? – Stack OverflowgetZoomLevel
3. MKMapViewDelegateのmapView:regionDidChangeAnimated:の中で上限、下限を超えたら上限、下限内に戻す処理を行います。
例えば


- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    double zoom = [mapView getZoomLevel];
    if(zoom > 17) {
        [mapView setCenterCoordinate:[mapView centerCoordinate] zoomLevel:17 animated:YES];
    }else if(zoom < 2) {
       [mapView setCenterCoordinate:[mapView centerCoordinate] zoomLevel:2 animated:YES];
    }
}

これでうまく動くと期待したのですが、何か勘違いしているのか何なのか、zoomLevelを2にする部分が期待した通りに動きません。
zoomLevelが2より小さくなったときに、このsetCenterCoordinateでzoomLevelを2にしようとしても何も起こりません。
デバッガでステップ実行をするとsetRegionで確かに適切なregionを設定しようとしているのですが、mapViewのregionが変更されません。
無理矢理に

mapView.region = newRegion;

のように設定しようとしてもダメ。
zoomLevelを5とか大きい値に設定しようとすると正常に動くというのもよく分からない。

ここに書かれている症状と同じなのかな?
iphone - MKMapView setRegion isn't constant - Stack Overflow

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です