If I have a MKMapView and a CLLocationCoordinate2D how do you test whether the map's visible area contains the coordinate?
How to know whether MKMapView visibleMapRect contains a Coordinate?
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.
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
my two cents for swift 5.1
extension MKMapView {
func contains(coordinate: CLLocationCoordinate2D) -> Bool {
return self.visibleMapRect.contains(MKMapPoint(coordinate))
}
}
© 2022 - 2024 — McMap. All rights reserved.