无法设置maprect以显示所有注释

时间:2015-01-26 16:51:20

标签: swift mkmapview mkannotation mkmaprect

我有2个注释要显示在mapview上,但无法设置maprect以在屏幕上显示所有这些注释而无需用户缩小。

我试过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

感谢您的帮助。

4 个答案:

答案 0 :(得分:19)

我终于找到了为什么注释的引脚没有显示在屏幕的可见区域中。我认为MapKit框架的行为与以前的版本略有不同。由于我使用autolayout允许地图扩展到所有设备(iPhone,iPad)的整个屏幕,因此应在mapViewDidFinishLoadingMap中调用setVisibleMapRect或mapView.showAnnotations,而不是在视图控制器的viewDidLoad中调用

例如:

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

答案 1 :(得分:3)

我打电话时遇到同样的问题

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

但是,将调用移到viewDidLayoutSubviews()似乎也解决了问题(不是在viewDidLoad中将isInitialLoad初始化为true)。

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

将调用置于viewDidLayoutSubviews中的差异(我认为这是一个优势)是地图尚未实际显示,因此您的初始显示是由注释定义的区域。但是,似乎每次地图缩放时都会调用它,因此您需要确保仅在第一次调用时调用它。

答案 2 :(得分: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)
}

答案 3 :(得分: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)
    }
}