IPhoneアプリ内でMKMapView
を使用しています。ボタンをクリックすると、ズームレベルを上げる必要があります。これが私の最初のアプローチです。
MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];
ただし、longitudeDelta値を更新しなかったため、このコードは効果がありませんでした。だから私はこの行を追加しました:
zoomIn.span.longitudeDelta *= 0.5;
今では機能しますが、時々しか機能しません。 latitudeDelta
とlongitudeDelta
は同じように変化しません。つまり、それらの値は比例しません。これを解決する方法はありますか?
これが正しい方法かどうかはわかりませんが、これを使用してズームインおよびズームアウトしています。
case 0: { // Zoom In
//NSLog(@"Zoom - IN");
MKCoordinateRegion region;
//Set Zoom level using Span
MKCoordinateSpan span;
region.center=mapView.region.center;
span.latitudeDelta=mapView.region.span.latitudeDelta /2.0002;
span.longitudeDelta=mapView.region.span.longitudeDelta /2.0002;
region.span=span;
[mapView setRegion:region animated:TRUE];
}
break;
// Zoom Out
case 2: {
//NSLog(@"Zoom - OUT");
MKCoordinateRegion region;
//Set Zoom level using Span
MKCoordinateSpan span;
region.center=mapView.region.center;
span.latitudeDelta=mapView.region.span.latitudeDelta *2;
span.longitudeDelta=mapView.region.span.longitudeDelta *2;
region.span=span;
[mapView setRegion:region animated:TRUE];
}
Dkdarelの答えをクリーンアップするだけ
// delta is the zoom factor
// 2 will zoom out x2
// .5 will zoom in by x2
- (void)zoomMap:(MKMapView*)mapView byDelta:(float) delta {
MKCoordinateRegion region = mapView.region;
MKCoordinateSpan span = mapView.region.span;
span.latitudeDelta*=delta;
span.longitudeDelta*=delta;
region.span=span;
[mapView setRegion:region animated:YES];
}
Swiftコード:
func zoomMap(byFactor delta: Double) {
var region: MKCoordinateRegion = self.mapView.region
var span: MKCoordinateSpan = mapView.region.span
span.latitudeDelta *= delta
span.longitudeDelta *= delta
region.span = span
mapView.setRegion(region, animated: true)
}
ここに簡単な解決策があります:
MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
DkardelのソリューションをSwiftに翻訳したところ:
@IBAction func zoomOutButtonClicked(sender: UIButton) {
let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*2, longitudeDelta: mapView.region.span.longitudeDelta*2)
let region = MKCoordinateRegion(center: mapView.region.center, span: span)
mapView.setRegion(region, animated: true)
}
@IBAction func zoomInButtonClicked(sender: UIButton) {
let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta/2, longitudeDelta: mapView.region.span.longitudeDelta/2)
let region = MKCoordinateRegion(center: mapView.region.center, span: span)
mapView.setRegion(region, animated: true)
}
これが、マップを注釈ポイントに移動し、それに非常に近くズームする私の方法です。ズームインを簡単に変更できますCGFloat newLatDelta = 0.06f;
- (void)moveMapToAnnotation:(MKPointAnnotation*)annotation
{
CGFloat fractionLatLon = map.region.span.latitudeDelta / map.region.span.longitudeDelta;
CGFloat newLatDelta = 0.06f;
CGFloat newLonDelta = newLatDelta * fractionLatLon;
MKCoordinateRegion region = MKCoordinateRegionMake(annotation.coordinate, MKCoordinateSpanMake(newLatDelta, newLonDelta));
[map setRegion:region animated:YES];
}
私はあなたと同じようなコードを使っていますが、うまくいくようです。発生している可能性があるのは、デルタが十分に変化しておらず、ズームレベルが1つのGoogleズームレベルから次のレベルに増加していることです。これは、マップの初期状態にも依存します。これは、マップが断続的である理由を説明する可能性があります。ユーザーがズームボタンを押す前に、マップとズームレベルを最初にどのように設定しますか?
また、提供するリージョンを調整するregionThatFitsメソッドを調べることもできます(名前は、Apple docs handyを持っていないため、メモリからのものです)。
Swift 4.2
let location = mapView.userLocation
let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
mapView.setRegion(region, animated: true)
- (IBAction)btnZoomInPressed
{
MKCoordinateRegion region;
MKCoordinateSpan span;
region.center.latitude = lati;
region.center.longitude = longi;
span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta /2.0002;
span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta /2.0002;
region.span=span;
[viewMapSingleVenue setRegion:region animated:TRUE];
}
- (IBAction)btnZoomOutPressed
{
MKCoordinateRegion region;
MKCoordinateSpan span;
region.center.latitude = lati;
region.center.longitude = longi;
span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta *2;
span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta *2;
if(span.latitudeDelta < 200)
{
region.span=span;
[viewMapSingleVenue setRegion:region animated:TRUE];
}
}
マップを回転すると、mapView.setRegion
メソッドに問題が発生する
mapView.camera.altitude
プロパティを使用してマップをズームできますが、アニメーション化されていません。
mapView.camera.altitude *= 1.05
新しいカメラオブジェクトを作成し、アニメーションで設定できます。
let currentCamera = mapView.camera
let newCamera: MKMapCamera
if #available(iOS 9.0, *) {
newCamera = MKMapCamera(lookingAtCenter: currentCamera.centerCoordinate, fromDistance: currentCamera.altitude * 2, pitch: currentCamera.pitch, heading: currentCamera.heading)
} else {
newCamera = MKMapCamera()
newCamera.centerCoordinate = currentCamera.centerCoordinate
newCamera.heading = currentCamera.heading
newCamera.altitude = currentCamera.altitude * 2
newCamera.pitch = currentCamera.pitch
}
mapView.setCamera(newCamera, animated: true)