如何确定MKMapView的visibleMapRect是否包含一个坐标?

12

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

3个回答

33

最快的方法是使用内置的苹果功能,这将使这种事情变得非常迅速!

if(MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(coordinate)))
{
    //Do stuff
}

其中的 coordinate 是您的 CLLocation2D。

这比使用大量的 if 语句计算坐标要快得多。原因是苹果使用四叉树,可以为您进行快速查找。


6

兼容Swift 3

如果你经常使用地图,我建议你创建一个类似于以下代码的扩展:

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

然后你可以在任何地方使用,例如:
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    if mapView.contains(coordinate: mapView.centerCoordinate) {
       // do stuff
    }
}

以这种方式编写代码的好处是:
  • 更易维护:如果苹果公司决定更改其框架,您将能够快速重构,在单个点上更改代码
  • 更易测试
  • 更易阅读和清晰

1

我对Swift 5.1的看法

  extension MKMapView {

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

 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接