Ios mkx27;不显示相应的图标
我在地图中使用自定义图标作为注释。 大约有200个针 在emulator中,我的地图看起来像这样 但是,在我的设备中,在我的用户位置附近有一些红点批注。 正如下图所示。 我猜这是由速度引起的某种运行时问题,是吗? 我该怎么解决这个问题 我使用两个类 ViewController.mIos mkx27;不显示相应的图标,ios,mkannotation,Ios,Mkannotation,我在地图中使用自定义图标作为注释。 大约有200个针 在emulator中,我的地图看起来像这样 但是,在我的设备中,在我的用户位置附近有一些红点批注。 正如下图所示。 我猜这是由速度引起的某种运行时问题,是吗? 我该怎么解决这个问题 我使用两个类 ViewController.m - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)an
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id
<MKAnnotation>)annotation
{
return [kmlParser viewForAnnotation:annotation];
}
-(MKAnnotationView*)映射视图:(MKMapView*)映射视图注释:(id)
)注释
{
返回[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;
}
注释的视图:(id)点
{
//找到拥有此点的KMLPlacemark对象并获取
//从它看风景。
用于(KMLPlacemark*placemark in_placemarks){
如果([位置标记点]==点)
返回[placemark annotationView];
}
返回零;
}
-(MKAnnotationView*)annotationView
{
如果(!annotationView){
id注释=[self point];
如果(注释){
MKPinAnnotationView*引脚=
[[MKPinAnnotationView alloc]initWithAnnotation:annotation
重用标识符:nil];
UIImage*img=[UIImage ImageName:@“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();
UIGraphicsSendImageContext();
pin.image=resizedImage;
pin.canShowCallout=是;
pin.animatesDrop=是;
注释视图=引脚;
}
}
返回注释视图;
}
不要创建
MKPinAnnotationView
,而是创建一个普通的MKAnnotationView
MKPinAnnotationView
子类倾向于忽略image
属性,因为它被设计为仅显示标准的红色、绿色和紫色管脚(通过pinColor
属性)
切换到MKAnnotationView
时,还必须注释掉animatesDrop
行,因为该属性特定于MKPinAnnotationView
@omz在评论中提到的另一点不会导致图像显示问题,但会影响性能: 无需在每次需要注释视图时以编程方式创建重新调整大小的图像:
- 正如@omz所说,您只需将一个已经调整大小的图像添加到您的包中即可
而不是所有CG的东西(因为你的图像基本上是一个常数)。这将是这里最好、最简单的改进pin.image = [UIImage imageNamed:@"WaterStationResized"];
- 如果您知道所有注释都将使用相同的图像,还可以消除
循环,只需在此处创建并返回注释视图。请记住,按原样,每次地图视图要求为每个注释提供视图时,都会执行for
循环for
- 代码看起来有点复杂,因此不清楚
是否确实是if(!annotationView)
。您可能需要确认这一点,因为这似乎是您的缓存机制YES
- 您也可以使用
,让地图视图为您进行缓存,而不是自己进行缓存dequeueReusableAnnotationViewWithIdentifier:
MKPinAnnotationView
,而是创建一个普通的MKAnnotationView
MKPinAnnotationView
子类倾向于忽略image
属性,因为它被设计为仅显示标准的红色、绿色和紫色管脚(通过pinColor
属性)
切换到MKAnnotationView
时,还必须注释掉animatesDrop
行,因为该属性特定于MKPinAnnotationView
@omz在评论中提到的另一点不会导致图像显示问题,但会影响性能: 无需在每次需要注释视图时以编程方式创建重新调整大小的图像:
- 正如@omz所说,您只需将一个已经调整大小的图像添加到您的包中即可
而不是所有CG的东西(因为你的图像基本上是一个常数)。这将是这里最好、最简单的改进pin.image = [UIImage imageNamed:@"WaterStationResized"];
- 如果您知道所有注释都将使用相同的图像,还可以消除
循环,只需在此处创建并返回注释视图。请记住,按原样,每次地图视图要求为每个注释提供视图时,都会执行for
循环for
- 代码看起来有点复杂,因此不清楚
是否确实是if(!annotationView)
。您可能需要确认这一点,因为这似乎是您的缓存机制YES
- 您也可以使用
,让地图视图为您进行缓存,而不是自己进行缓存dequeueReusableAnnotationViewWithIdentifier:
MKAnnotationView
的MKAnnotation
的地方,因为我已经编辑了我的帖子。我不知道为什么图像根本没有显示出来,但是为每个注释创建一个新图像似乎非常浪费,因为它们都是相同的。。。我建议在图形程序中调整图像的大小,并将大小正确的版本包含在捆绑包中,或者创建一次调整大小的版本,并将其缓存为代理的属性。此外:你应该使用UIGraphicsBeginImageContextWithOptions
,这样你就可以创建视网膜图像。我会做你推荐的事情。我发现,如果我首先将我的位置设置为远离注释,然后在一段时间后移回,它们就会正确显示