iOS SDK自定义图像图像在MapView上随机更改

时间:2012-09-20 15:48:01

标签: objective-c ios mapkit mkannotationview

我有一个使用MapView的应用程序,我正在添加自定义引脚注释。一切正常,但有时会显示另一个图像,我无法弄清楚原因。我从JSON API获取数据,它们肯定是正确的(数据库自几个月以来就没有被更改)。这是我在模型类中使用的函数来获取图像资源:

+ (UIImage *)pinImageForType:(VTStationType)type {

    NSString *imageName = nil;

    switch (type) {
        case kVTStationTypeOffstreetParking:
            imageName = @"PinGarage.png";
            break;

        case kVTStationTypeOnstreetParking:
            imageName = @"PinStreet.png";
            break;

        case kVTStationTypeCarwash:
            imageName = @"PinCarwash.png";
            break;

        case kVTStationTypeParkAndRide:
            imageName = @"PinPR.png";
            break;

        default:
            return nil;
        }

    NSLog(@"Image name: %@", imageName);
    return [UIImage imageNamed:imageName];
}

整个代码中没有其他方法可以获取图像资源。有趣的是,有时图像会发生变化,我在日志中看不到这种方法的调用。在我看来,这可能是某种记忆问题。能否请你帮忙?感谢。

修改

这是viewForAnnotation委托方法:

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

if ([annotation isKindOfClass:[MKUserLocation class]]) {

    return nil;

} else if ([annotation isKindOfClass:[VTParkingZoneAnnotation class]]) {

    NSLog(@"viewForAnnotation - ParkingZone - %@", annotation);
    return [self parkingOrStationAnnotationView:annotation];

} else if ([annotation isKindOfClass:[VTStationAnnotation class]]) {

    NSLog(@"viewForAnnotation - Station - %@", annotation);
    return [self parkingOrStationAnnotationView:annotation];

} else if ([annotation isKindOfClass:[VTCalloutAnnotation class]]) {

    return [self calloutAnnotationView:annotation];

} else {

    return nil;

}
}

以下是我创建视图的方法。 calloutAnnotationView是一个不同的注释,我们可以忽略它。这是方法parkingOrStationAnnotationView:

- (MKAnnotationView *)parkingOrStationAnnotationView:(id<MKAnnotation>)annotation {

MKAnnotationView *pinView = (MKAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationView"];

if (pinView) {
    pinView.annotation = annotation;
    return pinView;
}

pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationView"];
pinView.canShowCallout = NO;

if ([annotation isKindOfClass:[VTParkingZoneAnnotation class]]) {

    pinView.image = ((VTParkingZoneAnnotation *)annotation).parkingZone.pinImage;

} else if ([annotation isKindOfClass:[VTStationAnnotation class]]) {

    pinView.image = ((VTStationAnnotation *)annotation).station.pinImage;

}

return pinView;
}

1 个答案:

答案 0 :(得分:1)

在parkingOrStationAnnotationView中,即使重复使用现有的注释视图,也应该设置图像。