2015-01-26 3 views
7

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

Я пробовал с showAnnotations, но не повезло. Кто-нибудь смог это сделать в Swift и Xcode 6.1.1?

Вот мой код:

class ViewController: UIViewController, MKMapViewDelegate { 


    @IBOutlet var map: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var mapView = map 
     // 1 
     let point1 = CLLocationCoordinate2D(latitude: 38.915565, longitude: -77.093524) 
     let point2 = CLLocationCoordinate2D(latitude: 38.890693, longitude: -76.933318) 

     //2 
     let annotation = MKPointAnnotation() 
     annotation.setCoordinate(point1) 
     annotation.title = "point1" 
     map.addAnnotation(annotation) 

     let annotation2 = MKPointAnnotation() 
     annotation2.setCoordinate(point2) 
     annotation2.title = "point2" 
     map.addAnnotation(annotation2) 

     //3 
     // option1: set maprect to cover all annotations, doesn't work 
     var points = [annotation, annotation2] 
     var rect = MKMapRectNull 
     for p in points { 
      let k = MKMapPointForCoordinate(p.coordinate) 
      rect = MKMapRectUnion(rect, MKMapRectMake(k.x, k.y, 0.1, 0.1)) 
      println("result: x = \(rect.origin.x) y = \(rect.origin.y)") 
     } 

     map.setVisibleMapRect(rect, animated: true) 

     // option 2: using showAnnotations, doesn't work 
     //map.showAnnotations(points, animated: true) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    } 

Это то, что я получил в настоящее время: enter image description here

Это то, что я ожидал увидеть: enter image description here

Спасибо за вашу помощь.

+0

Не могли бы вы объяснить, что вы имеете в виду, говоря, что «showAnnotations» не работает »? Что происходит? Для 'setVisibleMapRect' вы можете применить ** вставку ** (см., Например, http://stackoverflow.com/a/22070026/467105). Кроме того, вы внедрили «viewForAnnotation», который показывает пользовательский образ для аннотаций, но на скриншоте, который вы «ожидаете», он показывает красные контакты по умолчанию. Почему вы ожидаете красных контактов по умолчанию? – Anna

+0

Анна, что я имел в виду для «не работает» для showAnnotations - это не отображать все контакты, как на ожидаемом экране. – tala9999

+0

Код с showAnnotes выглядит отлично. Если вы предпочитаете setVisibleMapRect вместо этого, добавьте вставку. _Удалить метод viewForAnnotation полностью при тестировании масштабирования. После того как масштабирование будет исправлено, устраните проблему с помощью viewForAnnotation._ Если не отображаются контакты, убедитесь, что вызывается viewForAnnotation (убедитесь, что установлен делегат карты, убедитесь, что файл изображения существует). – Anna

ответ

18

Я наконец выяснил, почему контакты аннотаций не были отображены в видимой области экрана. Я думаю, что структура MapKit ведет себя немного иначе, чем в предыдущих версиях. Так как я использую autolayout, чтобы позволить карту, чтобы развернуть на весь экран для всех устройств (iPhone'ов, IPAD), setVisibleMapRect или mapView.showAnnotations карты должно быть использовано в mapViewDidFinishLoadingMap, а не в viewDidLoad контроллера вид

Например :

func mapViewDidFinishLoadingMap(_ mapView: MKMapView) { 
    // this is where visible maprect should be set 
    mapView.showAnnotations(mapView.annotations, animated: true) 
} 
3

у меня была такая же проблема, когда я назвал

viewDidLoad() { 
    mapView.showAnnotations(myAnnotations, animated: false) 
} 

Однако перемещение вызов viewDidLayoutSubviews() также, кажется, решить эту проблему (не то, что isInitialLoad инициализируется верно в viewDidLo объявление).

viewDidLayoutSubviews() { 
    if isInitialLoad { 
     mapView.showAnnotations(myAnnotations, animated: false) 
     isInitialLoad = false 
    } 
} 

Разница (я думаю, что это преимущество) положить вызов в viewDidLayoutSubviews является то, что карта не на самом деле еще отображается, поэтому ваш начальный дисплей, что область, которая определяется аннотациями. Однако кажется, что он вызывается каждый раз, когда карта масштабируется, поэтому вы должны быть уверены, что вызываете ее только в первый раз.

+0

Да, это хороший подход. – tala9999

2

Для меня использование отображения аннотаций после того, как карта закончила загрузку, не работала.

func mapViewDidFinishLoadingMap(mapView: MKMapView!) { 
// this is where visible maprect should be set 
mapView.showAnnotations(mapView.annotations, animated: true) 
} 

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

Вместо этого я попробовал mapViewDidFinishRenderingMap и работал отлично. См. Пример ниже:

//MARK: - Show all objects after adding them on the map 
func mapViewDidFinishRenderingMap(mapView: MKMapView, fullyRendered: Bool) { 
    mapView.showAnnotations(mapStages, animated: true) 
} 
0

Вы можете попробовать это. Я создал расширение, чтобы показать все аннотации, используя некоторый код здесь и там в swift 2.3. Это не покажет все аннотации, если они не могут быть показаны даже при максимальном уровне масштабирования.

import MapKit 

extension MKMapView { 
    func fitAllAnnotations() { 
     var zoomRect = MKMapRectNull; 
     for annotation in annotations { 
      let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) 
      let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); 
      zoomRect = MKMapRectUnion(zoomRect, pointRect); 
     } 
     setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(20, 20, 20, 20), animated: true) 
    } 
}