0

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

1 に答える 1

1

ParkingOrStationAnnotationViewでは、既存のannotationViewを再利用する場合でも、画像を設定する必要があります。

于 2013-06-17T10:22:10.717 に答える