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:
.