Увеличение в MKMapView программно

голоса
23

Я использую MKMapViewвнутри приложения iPhone. При нажатии на кнопку уровень масштабирования должен увеличиваться. Это мой первый подход:

MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];

Тем не менее, этот код не имел никакого эффекта, так как я не обновлял значение longitudeDelta. Поэтому я добавил эту строку:

zoomIn.span.longitudeDelta *= 0.5;

Сейчас он работает, но только иногда. latitudeDeltaИ longitudeDeltaне изменяется таким же образом, я имею в виду, их значения не пропорциональны. Любая идея , как решить эту проблему?

Задан 23/06/2009 в 11:37
источник пользователем
На других языках...                            


9 ответов

голоса
27

Я понятия не имею, если это правильный способ сделать это, но я использую это, чтобы увеличивать и уменьшать масштаб.

        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];
    }
Ответил 29/07/2009 в 14:58
источник пользователем

голоса
21

Просто очистки ответ 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)
}
Ответил 21/11/2013 в 19:43
источник пользователем

голоса
21

Вот простое решение:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
Ответил 28/11/2012 в 18:40
источник пользователем

голоса
2

Просто перевел решение dkardel в Свифт:

@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)
}
Ответил 31/03/2015 в 08:43
источник пользователем

голоса
2

Вот мой способ переместить карту в точку аннотаций и приблизить довольно близко к нему. Вы можете легко изменить масштаб в строке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];
}
Ответил 01/04/2014 в 11:57
источник пользователем

голоса
1

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)
Ответил 17/05/2017 в 12:33
источник пользователем

голоса
1
- (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];
    }
}
Ответил 20/02/2015 в 13:56
источник пользователем

голоса
1

Я использую подобный код для Вашего и, кажется, работает. То, что может происходить в том, что ваша дельте не достаточно, чтобы вызвать изменение уровня масштабирования, чтобы увеличить с одного уровня Google трансфокатора к следующему. Это также будет зависеть от исходного состояния вашей карты, которая могла бы объяснить, почему это прерывистое - так как вы установите карту и уровень масштабирования до начала, до того, как пользователь нажимает кнопку зума?

Вы также можете посмотреть в метод regionThatFits который будет регулировать область, которую Вы предоставили (имя из памяти, как у меня нет яблока документы под рукой).

Ответил 23/06/2009 в 13:16
источник пользователем

голоса
0

В Swift 4.2

let location = mapView.userLocation
let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
mapView.setRegion(region, animated: true)
Ответил 22/03/2019 в 12:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more