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 2

1 ответ:

Вместо того, чтобы создавать MKPinAnnotationView, создайте простой MKAnnotationView.

Подкласс MKPinAnnotationView имеет тенденцию игнорировать СВОЙСТВО image, поскольку он предназначен для отображения стандартных красных, зеленых, фиолетовых контактов только (через свойство pinColor).

При переключении на MKAnnotationView Вам также придется закомментировать строку animatesDrop, поскольку это свойство относится к MKPinAnnotationView.


Отдельный момент, который не вызывает проблемы с отображением изображения, но может повлиять на производительность, - это то, что @omz упомянул в комментарий:

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

  • Как сказал @omz, вы можете просто добавить уже измененное изображение в свой пакет и просто сделать

    pin.image = [UIImage imageNamed:@"WaterStationResized"];
    

    Вместо всего этого CG-материала (поскольку ваш образ в основном является константой). Это было бы лучшим и самым простым улучшением здесь.

  • Если вы знаете, что все ваши аннотации будут использовать одно и то же изображение, вы также можете исключить for замкните цикл и просто создайте и верните вид аннотации прямо здесь. Помните, что как есть, что for цикл выполняет каждый раз, когда вид карты запрашивает представление для каждой аннотации.
  • код выглядит немного запутанным, поэтому неясно, является ли if (!annotationView) на самом деле YES. Вы можете подтвердить это, так как это, кажется, ваш механизм кэширования.
  • вместо того, чтобы делать свое собственное кэширование, вы также можете позволить просмотру карты сделать это за вас, используя dequeueReusableAnnotationViewWithIdentifier:.