Существует множество плохих способов сделать то, что я хочу сделать, но это похоже на один из таких случаев: "должен быть лучший способ".
Я использую MKMapView в приложении iPhone, который отображает несколько аннотаций. Представьте себе, что в каждом городе в штате США есть аннотация, поэтому на экране есть довольно плотная куча аннотаций. Когда пользователь масштабирует карту, эти аннотации начинают хрустеть друг на друга, пока они не перекрываются и становятся трудно выделяться индивидуально.
То, что я хотел бы сделать, заключается в том, что при определенной плотности аннотаций (например, при перекрытии любых аннотаций) объедините эти аннотации в одну аннотацию, которая указывает на то, что она включает в себя ряд суб-аннотаций (некоторый визуальный индикатор, "увеличьте масштаб, и вы увидите больше аннотаций" ).
Я мог бы вызвать CGRectIntersectsRect в представлениях аннотаций, но использование этого будет проблемой N ^ 2 - мне нужно было бы перебирать каждую аннотацию для каждой аннотации. Рассмотрим этот псевдокод:
FOR firstAnnotationView IN allAnnotationViews FOR secondAnnotationView in allAnnotationViews IF CGRectIntersectsRect(firstAnnotationView.frame, secondAnnotationView.frame) // found two overlapping annotations, consolidate them ENDIF ENDFOR ENDFOR
Вы можете понять, почему это будет медленным, и он должен запускаться каждый раз, когда карта будет увеличена или уменьшена!
Итак, как бы вы все обнаруживали перекрывающиеся аннотации на карте и с точки зрения производительности, консолидировать их разумно?