2015-01-21 3 views
0

У меня есть полная экранная карта, и я хочу увеличить масштаб до тех размеров, где все аннотации видны на карте, но только в области содержимого приложения, как указано в этом изображении :MKMapView zoom, чтобы показать все аннотации в кадре

enter image description here

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

Здесь я использую этот метод (категория), который выполняет задачу масштабирования по умолчанию для соответствия рамке карты. Но я застрял на том, как изменить этот фактор только в области содержимого:

- (void)zoomToShowAnnotations:(NSArray *)annotations extraPaddingMultiplier:(CGFloat)multiplier 
{ 
    CLLocationCoordinate2D topLeftCoord; 
    topLeftCoord.latitude = -90; 
    topLeftCoord.longitude = 180; 

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

    for(id<MKAnnotation> annotation in 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) * (multiplier != 0 ? multiplier : 1); // Add a little extra space on the sides 
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * (multiplier != 0 ? multiplier : 1); // Add a little extra space on the sides 

    [self setRegion:region animated:YES]; 
} 
+0

The setVisibleMapRect: edgePadding: анимационный метод должен сделать это проще. – Anna

ответ

1

Это просто список шагов, не фактический код или что-нибудь.

  1. Вычислите соотношение сторон региона, который вы нашли.
  2. Если соотношение сторон относительно шире (или равно) вашего желаемого отношения, перейдите к шагу 5.
  3. Постройте новую область, соответствующую вашей существующей области и соотношение сторон которой соответствует вашему желаемому соотношению (расширяйте ширину).
  4. Постройте новую область, соответствующую вашей расширенной области в пределах экрана (развернуть высоту).
  5. Стороны вниз.
+0

Как бы вычислить соотношение сторон MKCoorindateRegion? span.latitudeDelta/span.longitudeDelta? – Snowman

+0

И как бы я определил свое «желаемое соотношение» на шаге 2? – Snowman

+1

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

1

Согласно документации, этот метод должен выполняться на рабочем месте.

// Position the map such that the provided array of annotations are all visible to the fullest extent possible. 
@available(iOS 7.0, *) 
open func showAnnotations(_ annotations: [MKAnnotation], animated: Bool) 

Вы должны установить массив аннотаций и поместить его в функцию как этот

let annotation = MKPointAnnotation() 
    annotation.coordinate = CLLocationCoordinate2D(latitude: 11.12, longitude: 12.11) 
    mapView.addAnnotation(annotation) 
    mapView.showAnnotations([annotation], animated: true)