What you are seeing ist not clustering (you had to write code to get a cluster and you would usually see a cluster)
My experiments appear to suggest...
MKAnnotationViews
are rendered from top to bottom of the map. (It doesn't matter where north is).
- If
MapKit
decides to draw overlapping MKAnnotationViews
, then the MKAnnotationView
nearer to the bottom is drawn on top (because it's drawn later)
- Not only
MKAnnotationViews
, also titles rendered below MKMArkerAnnotationViews
need space. The rendering of those titles is influenced by markerView.titleVisibility
. If markerView.titleVisibility
is set to .visible
(instead of the default .adaptive
), then this title is stronger than a MarkerAnnotationView
that is rendered later, even if the later MarkerAnnotationView
has a displayPriority = .required
. The MarkerAnnotationView
nearer to the bottom is not rendered.
- This even happens if the
MarkerAnnotationView
nearer to the top has a low displayPriority
. So a MarkerAnnotationView
with low displayPriority
and .titleVisibility = .visible
can make a MarkerAnnotationView
nearer to the bottom with displayPriority = .required
disappear.
So what should you do:
- make sure
annotationView.displayPriority = .required
for all relevant annotations. (This is necessary but not sufficient)
- Do not set
annotationView.titleVisibility = .visible
or the title will make annotationViews disappear that are rendered nearer the bottom. Instead set annotationView.titleVisibility = .adaptive
I don't think you can control the visibility completely. But the problem with annotationView.titleVisibility = .visible
was surprising for me and you should avoid it because it will hide annotations.
Clusters behave like (and are) annotations that behave exactly as described above, if clusters are used.
Edit, a few years later:
Since iOS 14, MKAnnotationView
has two new variables:
Set a higher value to make sure the more important MKAnnotationView
stays visible. This works nicely.
For Annotations with the same zPriority
, the text above is still valid.
Please be aware that Apple decided to make zPriority
a property of MKAnnotationView
and not of MKAnnotation
.
This means as soon as MapKit decides to hide your favourite MKAnnotationView
, you can't set the zPriority
variable any more since the view doesn't exit any more. I solve this by setting zPriority
immediately after creation of the MKAnnotationView
. This last paragraph is not in Apples documentation.