Не удалось настроить maprect для отображения всех аннотаций

У меня есть 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.
    }


     }

Это то, что я получил в настоящее время:введите описание изображения здесь

Вот что я ожидал увидеть:введите описание изображения здесь

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

4 ответа

Решение

Я наконец выяснил, почему контакты аннотаций не были отображены в видимой области экрана. Я думаю, что инфраструктура 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)  
 }

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

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

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

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

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

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

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)
}

Вы можете попробовать это. Я создал расширение, чтобы показать все аннотации с использованием некоторого кода здесь и там в 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)
    }
}
Другие вопросы по тегам