How to know whether MKMapView visibleMapRect contains a Coordinate?

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

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.