Небольшое увеличение на MKCoordinateRegion? - PullRequest
5 голосов
/ 18 января 2011

Я масштабирую MKMapView, чтобы соответствовать ограничивающей области набора выводов, однако, когда отображаются выводы, я заметил, что в идеале масштабирование может быть немного более узким. Мое предлагаемое решение этого состояло в том, чтобы сделать дельты региона немного меньшими:

// SMALL ZOOM
region.span.latitudeDelta = (upper.latitude - lower.latitude) * 0.9;
region.span.longitudeDelta = (upper.longitude - lower.longitude) * 0.9;

Однако я заметил, что точные настройки, по-видимому, не приводят к небольшому увеличению зума, есть ли какая-то форма щелчка на зуме? Работают действительно маленькие значения, как и действительно большие, но простая регулировка размера области на несколько процентов, похоже, не работает, когда представление почти всегда прыгает / увеличивает масштаб и обрезает мои булавки.

EDIT:

Быстрые тесты, показывающие результаты различных коэффициентов масштабирования по региону:

 //                                                             SCALE FACTOR
 //                                                                  V
 region.span.latitudeDelta  =   (upper.latitude - lower.latitude) * 0.9;
 region.span.longitudeDelta = (upper.longitude - lower.longitude) * 0.9;

Вот результаты:

  • x0.5 область слишком мала, некоторые аннотации за пределами экрана
  • x0,6 То же, что и при использовании 1.0
  • x0,7 То же, что и при использовании 1.0
  • x0,8 То же, что и при использовании 1.0
  • x0,9 То же, что и при использовании 1.0
  • x1.0 Оригинальная посадка
  • x1.1 регион слишком большой, аннотации слишком маленькие на экране

Я хочу сказать, что очень маленькие корректировки (например, от 0,6 до 0,9), похоже, не имеют никакого значения.

Ответы [ 2 ]

6 голосов
/ 26 января 2011

Меньшие настройки никогда не приведут к изменению уровня масштабирования карты.Когда вы передаете регион, представление карты решает, какой уровень масштабирования использовать для наилучшего соответствия.Он никогда не будет использовать промежуточный уровень.Причина в том, что промежуточные уровни масштабирования выглядят нечеткими.Вы даете ему регион, который хотите показать, и он создает уровень масштабирования, который включает весь этот регион.Если вы зададите для * 1001 желаемый регион, то он вернет уровень, который он использует.

Если вы масштабируете карту с помощью щепотки, вы можете перейти на уровень между двумя уровнями масштабирования, но если дважды нажать(чтобы увеличить) или коснитесь двумя пальцами (чтобы уменьшить), вы увидите только «стандартные» уровни масштабирования.

Я говорю об уровнях масштабирования здесь, но на самом деле их нетв iOS так же, как они существуют в Google Maps.Существуют только регионы, если установить карту на определенном уровне.

С вашей проблемой наилучшего соответствия для выводов я обнаружил, что что-то изменилось в iOS 4, и код, который я использовал для размещения выводоввдруг дал слишком много места.Я разделил дельты на 3, и это снова сработало.Возможно, вы захотите заключить это в условное выражение, ориентированное только на iOS 4.

region.span.longitudeDelta = (maxCoord.longitude - minCoord.longitude) / 3.0;
region.span.latitudeDelta = (maxCoord.latitude - minCoord.latitude) / 3.0;

Глядя на свой код, вы используете * 0.9, чтобы получить точно такую ​​же вещь.

Один изСтранная вещь, которую я обнаружил, заключалась в том, что значение, возвращаемое regionThatFits:, не всегда было областью, которую в конечном итоге установил вид карты.Это может быть ошибка, но это было там с iOS 4.0.Вы можете проверить это самостоятельно, зарегистрировав MKCoordinateRegion из regionThatFits: и сравнив его с регионом карты после увеличения.Кажется, я помню, что он появлялся на форумах разработчиков Apple.

4 голосов
/ 18 января 2011

Я нашел этот метод чрезвычайно полезным. Все, что вам нужно сделать, это вызвать его и передать MKMapView в качестве аргумента, и он определит наилучший уровень масштабирования для всех ваших аннотаций. «Герметичность» можно отрегулировать, изменив множитель константы в закомментированных строках (в настоящее время 1.1).

Каков наилучший способ уменьшить и разместить все аннотации в MapKit

- (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];
}
...