Ios mkx27;不显示相应的图标

Ios mkx27;不显示相应的图标,ios,mkannotation,Ios,Mkannotation,我在地图中使用自定义图标作为注释。 大约有200个针 在emulator中,我的地图看起来像这样 但是,在我的设备中,在我的用户位置附近有一些红点批注。 正如下图所示。 我猜这是由速度引起的某种运行时问题,是吗? 我该怎么解决这个问题 我使用两个类 ViewController.m - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)an

我在地图中使用自定义图标作为注释。 大约有200个针

在emulator中,我的地图看起来像这样

但是,在我的设备中,在我的用户位置附近有一些红点批注。 正如下图所示。

我猜这是由速度引起的某种运行时问题,是吗? 我该怎么解决这个问题

我使用两个类

ViewController.m

- (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所说,您只需将一个已经调整大小的图像添加到您的包中即可

    pin.image = [UIImage imageNamed:@"WaterStationResized"];
    
    而不是所有CG的东西(因为你的图像基本上是一个常数)。这将是这里最好、最简单的改进

  • 如果您知道所有注释都将使用相同的图像,还可以消除
    for
    循环,只需在此处创建并返回注释视图。请记住,按原样,每次地图视图要求为每个注释提供视图时,都会执行
    for
    循环
  • 代码看起来有点复杂,因此不清楚
    if(!annotationView)
    是否确实是
    YES
    。您可能需要确认这一点,因为这似乎是您的缓存机制
  • 您也可以使用
    dequeueReusableAnnotationViewWithIdentifier:
    ,让地图视图为您进行缓存,而不是自己进行缓存

不要创建
MKPinAnnotationView
,而是创建一个普通的
MKAnnotationView

MKPinAnnotationView
子类倾向于忽略
image
属性,因为它被设计为仅显示标准的红色、绿色和紫色管脚(通过
pinColor
属性)

切换到
MKAnnotationView
时,还必须注释掉
animatesDrop
行,因为该属性特定于
MKPinAnnotationView


@omz在评论中提到的另一点不会导致图像显示问题,但会影响性能:

无需在每次需要注释视图时以编程方式创建重新调整大小的图像:

  • 正如@omz所说,您只需将一个已经调整大小的图像添加到您的包中即可

    pin.image = [UIImage imageNamed:@"WaterStationResized"];
    
    而不是所有CG的东西(因为你的图像基本上是一个常数)。这将是这里最好、最简单的改进

  • 如果您知道所有注释都将使用相同的图像,还可以消除
    for
    循环,只需在此处创建并返回注释视图。请记住,按原样,每次地图视图要求为每个注释提供视图时,都会执行
    for
    循环
  • 代码看起来有点复杂,因此不清楚
    if(!annotationView)
    是否确实是
    YES
    。您可能需要确认这一点,因为这似乎是您的缓存机制
  • 您也可以使用
    dequeueReusableAnnotationViewWithIdentifier:
    ,让地图视图为您进行缓存,而不是自己进行缓存

请将您的代码张贴在返回
MKAnnotationView
MKAnnotation
的地方,因为我已经编辑了我的帖子。我不知道为什么图像根本没有显示出来,但是为每个注释创建一个新图像似乎非常浪费,因为它们都是相同的。。。我建议在图形程序中调整图像的大小,并将大小正确的版本包含在捆绑包中,或者创建一次调整大小的版本,并将其缓存为代理的属性。此外:你应该使用
UIGraphicsBeginImageContextWithOptions
,这样你就可以创建视网膜图像。我会做你推荐的事情。我发现,如果我首先将我的位置设置为远离注释,然后在一段时间后移回,它们就会正确显示