如何知道MKMapView visibleMapRect是否包含Coordinate?

eri*_*ric 11 mapkit mkmapview ios ios5

如果我有一个MKMapView和一个CLLocationCoordinate2D,你如何测试地图的可见区域是否包含坐标?

Lee*_*ong 32

最快的方法是使用内置的Apple功能,这将使这种事情超级快!

if(MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(coordinate)))
{
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

坐标是你的CLLocation2D.

这比使用批量if语句计算坐标要快得多.原因是Apple使用Quadtree并且可以为您快速查找.


Luc*_*nzo 6

Swift 3兼容

如果您经常使用地图,我建议您创建一个这样的扩展:

extension MKMapView {

    func contains(coordinate: CLLocationCoordinate2D) -> Bool {
        return MKMapRectContainsPoint(self.visibleMapRect, MKMapPointForCoordinate(coordinate))
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以在任何地方使用,例如:

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    if mapView.contains(coordinate: mapView.centerCoordinate) {
       // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式你保持代码:

  • 更易于维护:如果Apple决定更改其框架,您将能够在一个点上进行快速重构更改代码
  • 更可测试
  • 更具可读性和清洁度