0

我想在地图中显示我的自定义注释,并将我的当前位置显示为地图视图中的标准图钉,颜色为蓝色。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    static NSString *identifier = @"MapPin";
    if ([annotation isKindOfClass:[MyAnnotations class]]) {
        MyAnnotations *ann= annotation;
        MKAnnotationView *annotationView = (MKAnnotationView *) [self.map dequeueReusableAnnotationViewWithIdentifier:identifier];
        if (annotationView == nil) {
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
            if (ann.custom){
                annotationView.image = [UIImage imageNamed:@"custom.png"];
            }else{
               //?? annotationView.image = [UIImage imageNamed:@"bluePin.png?"];
            }
        } else {
            annotationView.annotation = annotation;
        }
        if(ann.custom){
            UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            [nextButton addTarget:self action:@selector(annotationPicked) forControlEvents:UIControlEventTouchUpInside];
            annotationView.rightCalloutAccessoryView=nextButton;
        }
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
        annotationView.multipleTouchEnabled = NO;
        return annotationView;
    }
    return nil;
}
4

2 回答 2

0

如果该custom属性用于区分您的注释和地图视图的用户位置,则该情况已经由if检查注释类的第一个处理,并且该custom属性将是不必要的。

地图视图的用户位置注释是类型MKUserLocation,因此代码将nil在这种情况下返回,并且地图视图将显示标准蓝点(假设showsUserLocationYES)。


但是,如果该custom属性是为了区分您自己的两种类型的注释,那么一个问题是它没有正确处理重用的注释视图(何时annotationView != nil)。

当一个注释视图被重用时,它image可能rightCalloutAccessoryView不适合当前annotation的视图,因此无论视图是否被重用,都需要设置(或清除)这些属性。例如:

if ([annotation isKindOfClass:[MyAnnotations class]]) {
    MyAnnotations *ann= annotation;
    MKAnnotationView *annotationView = (MKAnnotationView *) [self.map dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView == nil) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
        annotationView.multipleTouchEnabled = NO;
    } else {
        annotationView.annotation = annotation;
    }

    //set view properties that depend on annotation-specific properties
    //regardless of whether view is new or re-used...
    if (ann.custom)
    {
        annotationView.image = [UIImage imageNamed:@"custom.png"];

        UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [nextButton addTarget:self action:@selector(annotationPicked) forControlEvents:UIControlEventTouchUpInside];
        annotationView.rightCalloutAccessoryView=nextButton;
    }
    else
    {
        annotationView.image = [UIImage imageNamed:@"bluePin.png"];
        annotationView.rightCalloutAccessoryView = nil;
    }

    return annotationView;
}

尽管如果该custom属性只是将所有注释与地图视图的用户位置分开,那么首先就没有必要(只要您检查注释class并设置showsUserLocationYES)。

于 2013-08-11T12:41:55.610 回答
0

可能是您在此事件中添加了自定义代码。因为当您单击当前位置注释时,此方法会调用此方法,并且可能是因为该代码应用程序崩溃。

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
}

谢谢。

于 2013-10-25T08:11:15.140 回答