How to know whether MKMapView visibleMapRect contains a Coordinate?

前端 未结 3 1952
情歌与酒
情歌与酒 2021-02-03 09:46

If I have a MKMapView and a CLLocationCoordinate2D how do you test whether the map\'s visible area contains the coordinate?

相关标签:
3条回答
  • 2021-02-03 10:35

    Swift 3 compatible

    If you frequently work with maps I suggest you to create an extension like this:

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

    Then you can use wherever, for example:

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

    In this way you keep the code:

    • more maintainable: if Apple decide to change its frameworks you will able to do a fast refactor changing code in a single point
    • more testable
    • more readable and clean
    0 讨论(0)
  • 2021-02-03 10:44

    The fastest way is to use the inbuilt Apple functions which will make this sort of thing super quick!

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

    Where coordinate is your CLLocation2D.

    This will be much faster than working out coordinates with a bulk if statement. Reason is that Apple use a Quadtree and can do fast lookups for you.

    0 讨论(0)
  • 2021-02-03 10:51

    my two cents for swift 5.1

      extension MKMapView {
    
          func contains(coordinate: CLLocationCoordinate2D) -> Bool {
            return self.visibleMapRect.contains(MKMapPoint(coordinate))
        }
    
     }
    
    0 讨论(0)
提交回复
热议问题