Мне действительно нужно было это сделать, и ни один из (текущих) ответов, казалось, не дал надежной реализации. Они вроде бы работали, но панорамирование карты, выбор аннотаций или увеличение может снова испортить порядок.
Окончательное, хорошо себя зарекомендовавшее решение не было таким тривиальным, поэтому я просто обрисую шаги, которые я предпринял здесь. Порядок аннотаций, используемый MKMapView
, не учитывает добавленный порядок или даже порядок переопределенного свойства annotations
. Итак ...
Steps
• Создать CADisplayLink
• Каждый кадр, переупорядочивать аннотации, используя и слой zPosition, и порядок представления в массиве subviews
суперпредставления.
• Если выбран вид, выдвиньте его на передний план в схеме заказа
• Нажатие на аннотации по-прежнему учитывает внутреннее упорядочение MKMapView
, несмотря на уже внесенные изменения. Чтобы противостоять этому, добавьте MKMapViewDelegate
• В методе mapView:didSelect:
объекта делегата проверьте, соответствует ли выбранная аннотация желаемому
• Вы можете определить правильную / расставленную по приоритетам аннотацию, запустив тесты попадания на аннотации самостоятельно, с учетом собственного заказа
• Если выбранная аннотация верна, отлично. Если нет, выберите правильную аннотацию вручную, используя selectAnnotation:animated:
И вот оно у вас есть. Вышеупомянутый метод, кажется, работает хорошо, и снижение производительности от выполнения этого каждого кадра не так уж плохо. Вы также можете посмотреть на переключение на MapBox, который, я считаю, поддерживает упорядочение аннотаций, но это не всегда возможно по разным причинам.