Какой лучший способ уменьшить все размеры аннотаций в MapKit? - PullRequest
14 голосов
/ 13 ноября 2010

Быстрый фон того, что у меня происходит.UIMapView загружает и показывает одну аннотацию (не более одной).В строке меню есть кнопка «Найти меня», при касании местоположение пользователя будет найдено и отображено как вторая аннотация.Затем я уменьшил MapView, чтобы уместить эти аннотации в диапазоне, но я не могу найти подходящий способ сделать это.В зависимости от того, где размещена первая аннотация по отношению к местоположению пользователя, иногда она недостаточно уменьшается.

Например, если аннотация расположена к северо-западу от пользователя, она хорошо масштабируется.Но если аннотация расположена к юго-востоку от пользователя, она лишь уменьшит масштаб настолько, что они просто обрезаются, и вам придется вручную уменьшить немного больше.Вот код, который я использую, вариант некоторых других, которые я нашел на SO.

        CLLocation *whereIAm = mapView.userLocation.location;

        float lat = whereIAm.coordinate.latitude;
        float lon = whereIAm.coordinate.longitude;


        CLLocationCoordinate2D southWest = {[currentLatitude floatValue], [currentLongitude floatValue]};
        CLLocationCoordinate2D northEast = southWest;

        southWest.latitude = MIN(southWest.latitude, lat);
        southWest.longitude = MIN(southWest.longitude, lon);

        northEast.latitude = MAX(northEast.latitude, lat);
        northEast.longitude = MAX(northEast.longitude, lon);

        CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
        CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];

        CLLocationDistance meters = [locSouthWest distanceFromLocation:locNorthEast];

        MKCoordinateRegion region;
        region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
        region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
        region.span.latitudeDelta = meters / 111319.5
        region.span.longitudeDelta = 7.0;

        MKCoordinateRegion savedRegion = [mapView regionThatFits:region];
        [mapView setRegion:savedRegion animated:YES];

        [locSouthWest release];
        [locNorthEast release];

Есть ли лучший способ встроенный в MapKit, чтобы просто уменьшить масштаб, чтобы обе аннотации имели, скажем, полдюйма междуих на внешней раме?Мне все равно, нужно ли пользователю увеличивать масштаб изображения, я просто хочу, чтобы он правильно уменьшал масштаб.

Ответы [ 4 ]

32 голосов
/ 13 ноября 2010
-(void)zoomToFitMapAnnotations:(MKMapView*)mapView
{
    if([mapView.annotations count] == 0)
        return;

    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;

    CLLocationCoordinate2D bottomRightCoord;
    bottomRightCoord.latitude = 90;
    bottomRightCoord.longitude = -180;

    for(MapAnnotation* annotation in mapView.annotations)
    {
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);

        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);
    }

    MKCoordinateRegion region;
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides

    region = [mapView regionThatFits:region];
    [mapView setRegion:region animated:YES];
}

Взято из: http://codisllc.com/blog/zoom-mkmapview-to-fit-annotations/

(Используйте все время.)

8 голосов
/ 04 апреля 2014

В iOS7 есть метод, который делает именно это.Просто позвоните:

[yourMapView showAnnotations:yourAnnotationsArray animated:YES];
1 голос
/ 02 января 2015

Вы можете использовать этот код для отображения всех аннотаций

MKMapRect zoomRect = MKMapRectNull;
for (id <MKAnnotation> annotation in mapView.annotations)
{
    MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
    MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
    zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
[mapView setVisibleMapRect:zoomRect animated:YES];

если вы хотите указать местоположение пользователя, просто замените две строки ниже на первую строку кода выше

MKMapPoint annotationPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate);
MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
1 голос
/ 02 апреля 2013

Те, кто делает однотонное c # кодирование

BasicMapAnnotation является классом наследования от MKAnnotation

private void GetRegion(MKMapView mapView)
{
    var userWasVisible = mapView.ShowsUserLocation;
    mapView.ShowsUserLocation = false; // ignoring the blue blip
    // start with the widest possible viewport
    var tl = new CLLocationCoordinate2D(-90, 180); // top left
    var br = new CLLocationCoordinate2D(90, -180); // bottom right
    foreach (var an in mapView.Annotations)
    {
        // narrow the viewport bit-by-bit
        CLLocationCoordinate2D coordinate = ((BasicMapAnnotation) an).Coordinate;
        tl.Longitude = Math.Min(tl.Longitude, coordinate.Longitude);
        tl.Latitude = Math.Max(tl.Latitude, coordinate.Latitude);
        br.Longitude = Math.Max(br.Longitude, coordinate.Longitude);
        br.Latitude = Math.Min(br.Latitude, coordinate.Latitude);
    }
    var center = new CLLocationCoordinate2D
    {
        // divide the range by two to get the center
        Latitude = tl.Latitude - (tl.Latitude - br.Latitude)*0.5,Longitude = tl.Longitude + (br.Longitude - tl.Longitude)*0.5

    };
    var span = new MKCoordinateSpan
    {
        // calculate the span, with 20% margin so pins aren’t on the edge
        LatitudeDelta = Math.Abs(tl.Latitude - br.Latitude)*1.2,LongitudeDelta = Math.Abs(br.Longitude - tl.Longitude)*1.2

    };
    var region = new MKCoordinateRegion {Center = center, Span = span};
    region = mapView.RegionThatFits(region); // adjusts zoom level too
                mapView.SetRegion(region, true); // animated transition
                mapView.ShowsUserLocation =

    userWasVisible;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...