我正在使用以下代码
-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([[annotation title] isEqualToString:@"Current Location"] )
{
MKAnnotationView *anView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentPin"];
anView.image = [UIImage imageNamed:@"pin_green.png"];
anView.canShowCallout = true;
anView.enabled = true;
return anView;
}
问题是,它随机消失并再次出现。给用户带来非常糟糕的体验。有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
你应该使用MKMapView的dequeueReusableAnnotationViewWithIdentifier:
,看看你是否在使用initWithAnnotation:reuseIdentifier:
创建新视图之前获得了一个视图:
MKAnnotationView *anView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"currentPin"];
if (!anView) {
anView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentPin"];
anView.image = [UIImage imageNamed:@"pin_green.png"];
anView.canShowCallout = true;
anView.enabled = true;
}
return anView;
那就是说,我不完全确定这是你问题的原因。
答案 1 :(得分:0)
关于此代码有几个可疑的事情:
您没有使用dequeue
,正如有人指出的那样。特别是,这里的问题是你每次都在制作一个新视图,而不是检查新视图是否需要制作。
您忘记了关键步骤,即将视图与注释相关联。
以下是简单viewForAnnotation:
实现的规范结构,我们提供了自己的视图:
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id <MKAnnotation>)annotation {
MKAnnotationView* v = nil;
if ([annotation.title isEqualToString:@"Current Location"]) {
static NSString* ident = @"greenPin";
v = [mapView dequeueReusableAnnotationViewWithIdentifier:ident];
if (v == nil) {
v = [[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:ident];
v.image = [UIImage imageNamed:@"pin_green.png"];
v.canShowCallout = YES;
}
v.annotation = annotation;
}
return v;
}
由于该代码适合我,我建议你从它开始并根据需要进行调整。
顺便说一句,你不需要这种方法只是为了得到一个绿色的针!你知道吗,对吗? iOS将为您提供绿色图钉(MKPinAnnotationColorGreen)。