适用于iOS的标准地图注释

时间:2013-08-11 10:04:39

标签: ios mapkit mkannotation mkannotationview

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

- (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;
}

2 个答案:

答案 0 :(得分:0)

如果custom属性要区分您的注释和地图视图的用户位置,那么该案例已由第一个if处理,该custom检查注释的类和MKUserLocation属性没必要。

地图视图的用户位置注释类型为nil,因此在这种情况下代码将返回showsUserLocation,地图视图将显示标准蓝点(假设YES为{{ 1}})。


但是,如果custom属性要区分两种类型的自己的注释,那么一个问题是它不能正确处理重复使用的注释视图({{1}时})。

重复使用注释视图时,其annotationView != nilimage可能不适合当前的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; } 属性只是将所有您的注释与地图视图的用户位置分开,但首先不需要它(只要您检查注释的{{1}将custom设置为class)。

答案 1 :(得分:0)

可能是您在此事件中放入自定义代码。因为当您单击此方法调用的当前位置注释时,可能会因为该代码应用程序崩溃而导致崩溃。

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

感谢。