Ios 如何制作自定义pin并同时使用FollowWithHeading模式?

Ios 如何制作自定义pin并同时使用FollowWithHeading模式?,ios,gps,annotations,mapkit,mkusertrackingmode,Ios,Gps,Annotations,Mapkit,Mkusertrackingmode,下面的代码显示自定义pin(图片为pin)。它可以正常使用 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { PVAttractionAnnotationView *annotationView = [[PVAttractionAnnotationView alloc] initWithAnnotation:annotation

下面的代码显示自定义pin(图片为pin)。它可以正常使用

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

   PVAttractionAnnotationView *annotationView = [[PVAttractionAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Attraction"];
   annotationView.canShowCallout = YES;
   return annotationView;

}
XCODE跳转到main.m并显示

线程1:信号SIGABRT

另一方面,如果我使用以下代码

[self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading];
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

   PVAttractionAnnotationView *annotationView = [[PVAttractionAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Attraction"];
   annotationView.canShowCallout = YES;
   return annotationView;

}
并且未使用以下所有代码

[self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading];
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

   PVAttractionAnnotationView *annotationView = [[PVAttractionAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Attraction"];
   annotationView.canShowCallout = YES;
   return annotationView;

}
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释{
PVAttractionAnnotationView*annotationView=[[PVAttractionAnnotationView alloc]initWithAnnotation:annotation重用标识符:@“Attraction”];
annotationView.canShowCallout=是;
返回注释视图;
}
应用程序将正常显示当前位置,但不显示自定义pin。它显示的红色pin是系统的默认值,因为我没有使用该代码

如何制作自定义pin并同时使用
FollowWithHeading
模式


…很抱歉,我的英语使用不好。

您需要对注释的
视图稍作更改,该视图将检查注释的类并返回相应的视图。通过返回nil,系统将使用默认视图。您还需要一些附加代码来正确实现视图重用-

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView *annotationView=nil;
    if ([annotation isKindOfClass:[PVAttractionAnnotation class]])  // Note - put your custom annotation class here
    {
        annotationView =(MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"Attraction"];
        if (annotationView == nil)
        {
            annotationView = [[PVAttractionAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Attraction"];  
            annotationView.canShowCallout = YES; 
        }
        else
        {
            annotationView.annotation=annotation;
        }

    }
    return annotationView;
}
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释
{
MKAnnotationView*annotationView=nil;
if([annotation isKindOfClass:[PVAttractionAnnotation class]])//注意-将自定义注释类放在此处
{
annotationView=(MKAnnotationView*)[mapView出列重用AnnotationViewWithIdentifier:@“Attraction”];
如果(注释视图==nil)
{
annotationView=[[PVAttractionAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@“Attraction”];
annotationView.canShowCallout=是;
}
其他的
{
annotationView.annotation=注释;
}
}
返回注释视图;
}

我明白了!!谢谢你的好意。有一点可能很关键:如果出列返回一个视图,代码应该更新重用视图的注释属性,否则重用视图将链接到错误的注释。因此,对于内部的
if
,添加一个
else
部分:
if(annotationView==nil){…}else{annotationView.annotation=annotation;}
canShowCallout
的设置实际上可以在创建视图的块内移动(在初始化之后),因为它不会随注释而改变。