#ios #mapkit #mkpinannotationview
#iOS #mapkit #mkpinannotationview
Вопрос:
Я написал некоторый код для отображения аннотаций с пользовательскими изображениями в mapview. Мой делегат mapview реализует этот метод для настройки аннотаций при их размещении на карте:
- (MKAnnotationView *) mapView:(MKMapView *) mapView viewForAnnotation:(id<MKAnnotation>) annotation {
if ([annotation isKindOfClass:[Station class]]) {
Station *current = (Station *)annotation;
MKPinAnnotationView *customPinview = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
if([[current type] compare:FONTANELLA]==NSOrderedSame)
customPinview.pinColor = MKPinAnnotationColorPurple;
else{
int test=current.bici;
if(test==0)
customPinview.image = [UIImage imageNamed:@"bicimir.png"];
else if(test<4)
customPinview.image = [UIImage imageNamed:@"bicimi.png"];
else if(test>=4)
customPinview.image = [UIImage imageNamed:@"bicimig.png"];
}
customPinview.animatesDrop = NO;
customPinview.canShowCallout = YES;
return customPinview;
}
else{
NSString *identifier=@"MyLocation";
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
return annotationView;
}
}
Проблема заключается в странном поведении, когда я долго нажимаю на пользовательскую аннотацию на карте: изображение меняется и отображается красный значок по умолчанию.
Почему такое поведение? И как я могу этого избежать?
Ответ №1:
Если вы хотите использовать пользовательское изображение для просмотра аннотаций, создайте общее MKAnnotationView
вместо MKPinAnnotationView
.
MKPinAnnotationView
Действительно нравится отображать изображение по умолчанию, которое является pin-кодом.
Немного измените логику, чтобы для FONTANELLA
она создавала MKPinAnnotationView
, а для остальных — MKAnnotationView
.
Кроме того, вам действительно следует реализовать повторное использование представления аннотаций для всех случаев (и последняя else
часть не имеет смысла, поскольку ничего не делается, если удаление из очереди ничего не возвращает — вы могли бы просто сделать return nil;
вместо этого).
Ответ №2:
внутри файла .h
@interface AddressAnnotation : NSObject<MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString *mPinColor;
}
@property (nonatomic, retain) NSString *mPinColor;
@end
в файле .m
@implementation AddressAnnotation
@synthesize coordinate mPinColor;
- (NSString *)pincolor{
return mPinColor;
}
- (void) setpincolor:(NSString*) String1{
mPinColor = String1;
}
-(id)initWithCoordinate:(CLLocationCoordinate2D) c{
coordinate=c;
NSLog(@"%f,%f",c.latitude,c.longitude);
return self;
}
@end
внутри файла .m class
- (MKAnnotationView *) mapView:(MKMapView *)mapView1 viewForAnnotation:(AddressAnnotation *) annotation{
UIImage *anImage=[[UIImage alloc] init];
MKAnnotationView *annView=(MKAnnotationView*)[mapView1 dequeueReusableAnnotationViewWithIdentifier:@"annotation"];
if(annView==nil)
{
annView=[[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation"] autorelease];
}
if([annotation.mPinColor isEqualToString:@"green"])
{
anImage=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Google pin green.png" ofType:nil]];
}
else if([annotation.mPinColor isEqualToString:@"red"])
{
anImage=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Google pin red.png" ofType:nil]];
}
else if([annotation.mPinColor isEqualToString:@"blue"])
{
anImage=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Google pin blue.png" ofType:nil]];
}
annView.image = anImage;
return annView;
}