MKAnnotation не показывает соответствующую иконку
Я использовал пользовательский значок в качестве аннотации на своей карте. Есть около 200 булавок.
В эмуляторе моя карта выглядит следующим образом.

Однако в моем устройстве есть некоторые красные точки аннотации, которые находятся рядом с моим местоположением пользователя.
Так же, как показано на рисунке ниже.

Я предполагаю, что это проблема какой-то проблемы времени выполнения, вызванной скоростью, не так ли? Что я должен сделать, чтобы решить эту проблему?
Я использую два классы
ViewController.m
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id
<MKAnnotation>)annotation
{
return [kmlParser viewForAnnotation:annotation];
}
KMLParser.m
- (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)point
{
// Find the KMLPlacemark object that owns this point and get
// the view from it.
for (KMLPlacemark *placemark in _placemarks) {
if ([placemark point] == point)
return [placemark annotationView];
}
return nil;
}
- (MKAnnotationView *)annotationView
{
if (!annotationView) {
id <MKAnnotation> annotation = [self point];
if (annotation) {
MKPinAnnotationView *pin =
[[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:nil];
UIImage * img = [UIImage imageNamed:@"WaterStation"] ;
CGRect resizeRect;
resizeRect.size.height = 40;
resizeRect.size.width = 40;
resizeRect.origin = (CGPoint){0.0f, 0.0f};
UIGraphicsBeginImageContext(resizeRect.size);
[img drawInRect:resizeRect];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
pin.image = resizedImage;
pin.canShowCallout = YES;
pin.animatesDrop = YES;
annotationView = pin;
}
}
return annotationView;
}
1 ответ:
Вместо того, чтобы создавать
MKPinAnnotationView, создайте простойMKAnnotationView.Подкласс
MKPinAnnotationViewимеет тенденцию игнорировать СВОЙСТВОimage, поскольку он предназначен для отображения стандартных красных, зеленых, фиолетовых контактов только (через свойствоpinColor).При переключении на
MKAnnotationViewВам также придется закомментировать строкуanimatesDrop, поскольку это свойство относится кMKPinAnnotationView.
Отдельный момент, который не вызывает проблемы с отображением изображения, но может повлиять на производительность, - это то, что @omz упомянул в комментарий:Вам не нужно программно создавать изображение нового размера каждый раз, когда требуется представление аннотации:
Как сказал @omz, вы можете просто добавить уже измененное изображение в свой пакет и просто сделать
pin.image = [UIImage imageNamed:@"WaterStationResized"];Вместо всего этого CG-материала (поскольку ваш образ в основном является константой). Это было бы лучшим и самым простым улучшением здесь.
- Если вы знаете, что все ваши аннотации будут использовать одно и то же изображение, вы также можете исключить
forзамкните цикл и просто создайте и верните вид аннотации прямо здесь. Помните, что как есть, чтоforцикл выполняет каждый раз, когда вид карты запрашивает представление для каждой аннотации.- код выглядит немного запутанным, поэтому неясно, является ли
if (!annotationView)на самом делеYES. Вы можете подтвердить это, так как это, кажется, ваш механизм кэширования.- вместо того, чтобы делать свое собственное кэширование, вы также можете позволить просмотру карты сделать это за вас, используя
dequeueReusableAnnotationViewWithIdentifier:.