Roy*_*y K 5 mapkit mkannotationview ios
我正在开发一个小项目,在地图上显示7种不同类型的注释.我的注释取自数组中的url结果,我使用JSON解析它.我有很多注释,一旦地图加载,一切看起来都很好.放大和缩小后,引脚图像由于某种原因改变为错误的引脚图像(特定图像,没有线索原因).
我相信我在这里遗失了一些东西......请你帮忙:)?
这是我的代码的一部分,如果您需要它,请告诉我:
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
static NSString *identifier;
if(_mapView.tag==1){identifier = @"TurbulencePin";}
if(_mapView.tag==2){identifier = @"IcingPin";}
if(_mapView.tag==3){identifier = @"WindsPin";}
if(_mapView.tag==4){identifier = @"TemperaturePin";}
if(_mapView.tag==5){identifier = @"CloudsPin";}
if(_mapView.tag==6){identifier = @"VisibilityPin";}
if(_mapView.tag==7){identifier = @"MultiplePin";}
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
if ([annotation isKindOfClass:[Annotation class]]) {
CustomAnnotationView* annotationView = (CustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
annotationView = nil;
if (annotationView == nil) {
annotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
annotationView.enabled = YES;
annotationView.canShowCallout = YES;
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",identifier]];
annotationView.image = img;
}
else
{
annotationView.annotation = annotation;
}
return annotationView;
}
return nil;
}
Run Code Online (Sandbox Code Playgroud)
更新:
根据其他人的反馈,我修改了图像设置的代码如下:
Annotation *myCustomAnn = (Annotation *)annotation;
NSString *imgName = myCustomAnn.imageName;
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"%@Pin.png",imgName]];
annotationView.image = img;
return annotationView;
Run Code Online (Sandbox Code Playgroud)
另外,我删除了 annotationView = nil;
但是,我无法将annotation.m中的图像名称设置为硬编码值,因为我需要为每个注释显示不同的图像.我确信有一个解释,但我可以从mapView:viewForAnnotation下的annotation.m获得的唯一值是注释坐标(myCustomAnn.coordinate.latitude而且myCustomAnn.coordinate.longitude),我不知道如何从annotation.m获取其他属性.
其他属性,如title,imgname等返回null
小智 5
主要问题是代码viewForAnnotation依赖于外部变量_mapView.tag来确定注释视图.
假设viewForAnnotation地图调用委托方法的时间和频率是不安全的.
如果注释的视图取决于某些值,通常最好将这些值直接嵌入到注释对象本身中.这样,在viewForAnnotation委托方法中,您可以通过annotation传递给方法的参数引用这些特定于注释的值.应在创建注释(调用之前addAnnotation)时设置这些特定于注释的值.
有关更多详细信息和示例,请参阅:
一个单独的问题是代码在调用后设置annotationView为失败出列.nildequeueReusableAnnotationViewWithIdentifier
至少在viewForAnnotation,它处理Annotation类的更正代码可能看起来像这样(不是整个方法 - 只是第二个内部的部分if):
static NSString *identifier = @"ann";
CustomAnnotationView* annotationView = (CustomAnnotationView*)[mapView
dequeueReusableAnnotationViewWithIdentifier:identifier];
//annotationView = nil; // <-- remove this line
if (annotationView == nil)
{
annotationView = [[CustomAnnotationView alloc]
initWithAnnotation:annotation
reuseIdentifier:identifier];
annotationView.enabled = YES;
annotationView.canShowCallout = YES;
}
else
{
annotationView.annotation = annotation;
}
//MOVE the setting of the image to AFTER the dequeue/create
//because the image property of the annotation view
//is based on the annotation and we can update image in one place
//after both the dequeue and create are done...
//Get the image name from the annotation ITSELF
//from a custom property (that you add/set)
Annotation *myCustomAnn = (Annotation *)annotation;
NSString *imgName = myCustomAnn.imageName;
//imageName is the custom property you added/set
UIImage *img = [UIImage imageNamed:
[NSString stringWithFormat:@"%@.png",imgName]];
annotationView.image = img;
return annotationView;
Run Code Online (Sandbox Code Playgroud)
一个问题是viewForAnnotation根据类实例变量确定要显示的正确图像。通常,注释图像的标识符是自定义注释本身的属性,而不是某些外部实例变量。
最重要的是,在设置所有注释的属性之前,注释似乎已添加到地图中。人们应该推迟addAnnotation直到所有注释的属性都设置完毕。
或者,您可以将注释添加到 a 中NSMutableArray,根据需要调整它们,并且仅使用 (注意 s) 在最后添加注释addAnnotations,并将其传递给数组。
| 归档时间: |
|
| 查看次数: |
6705 次 |
| 最近记录: |