MKMapView и dequeueReusableAnnotationViewWithIdentifier: - PullRequest
3 голосов
/ 10 сентября 2009

У меня есть MKMapView с около 1000 MKPinAnnotationView на экране одновременно.

С очень низкой скоростью прокрутки.

Я пытаюсь снять свои представления аннотаций соответствующим образом, вот так:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    static NSString *viewIdentifier = @"annotationView";
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier];
    if (annotationView == nil) {
        annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewIdentifier] autorelease];
    }

    return annotationView;
}

Однако мои аннотации никогда не используются повторно! У меня есть 1000 экземпляров MKPinAnnotationView на моей карте одновременно. Я не могу не чувствовать, что это способствует снижению производительности.

Является ли это правильным способом удаления многократно используемых аннотаций? Разве они не используются повторно, потому что все они находятся на одном экране в одно и то же время и, следовательно, требуют отдельных экземпляров?

Какие-нибудь советы по ускорению прокрутки с большим количеством выводов на экране?

Ответы [ 4 ]

2 голосов
/ 11 октября 2010

Если ваша карта полностью уменьшена, то она не собирается просто удалять булавки без всякой причины. Булавки снимаются только тогда, когда они не видны.

Из опыта я могу сказать, что 1000 контактов карты намного превышают верхний предел того, что считается стабильным практически для любого устройства, тем более для старых устройств.

Старое устройство, такое как iPhone 3G, может даже обойтись в 100-150, прежде чем вы начнете видеть chop (конечно, это зависит от того, что еще делает ваше приложение).

Я пишу приложение, которое широко использует MKMapView, и я вынужден установить логику для регулирования количества выводов, видимых на карте, в зависимости от типа устройства.

Есть два возможных решения

1) Ограничьте границы масштабирования карты, чтобы пользователь не мог уменьшить масштаб настолько, чтобы он видел все булавки одновременно (на самом деле я раньше этого не делал, поэтому не знаю, возможно ли это) , но это было бы идеей).

2) Создайте предложенные фильтры, ограничивающие показанные штыри.

1 голос
/ 11 сентября 2009

Ваш код выглядит правильно. Контакты не будут использоваться повторно, пока они находятся на экране. Они доступны для повторного использования сразу же после выключения экрана.

Я бы подумал, что с таким количеством выводов, которые они представляют, в любом случае будет трудно отличить. Можно ли уменьшить количество выводов на экране, предоставив опции фильтра пользователя, или что-то аналогичное.

0 голосов
/ 22 марта 2011

Вы пытались создать свое приложение с iOS 4.3 SDK? У меня была та же проблема, когда представления аннотаций использовались повторно, только если они были за сотни миль, но в iOS 4.3 я вижу гораздо более разумное поведение повторного использования.

MKMapView загружает все виды аннотаций одновременно (включая те, которые находятся вне текущего прямоугольника)

0 голосов
/ 29 марта 2010

То, что вы ожидаете, - это своего рода «отсечение» представлений аннотаций на основе текущей region карты.

См. Мой подробный ответ здесь: MKMapView загружает все представления аннотаций водин раз (включая те, которые находятся вне текущего прямоугольника)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...