1

カスタム注釈を作成しており、dequeueReusableAnnotation を使用しようとしています。ピンの違いは、ピン画像に使用される png です。

myAnnotation クラスを作成し、注釈を作成するときにこのコードを使用します。

  if([category isEqualToString:@"anti-social-behaviour"]){
        point.annotationImg=@"A.png";

    }
    else
        if([category isEqualToString:@"burglary"]){
            point.annotationImg=@"B.png";

        }
        else....

今viewForAnnotationで:

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

if ([annotation class] == MKUserLocation.class) {
    return nil;

 }

static NSString *identifier = @"myPin";

MKPinAnnotationView *pinView = nil;

pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

if (pinView == nil)
{
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    pinView.canShowCallout = YES;
    pinView.image = [UIImage imageNamed:[(Annotation*)annotation annotationImg]];

}


return pinView;

}

何らかの方法で識別子を使用する必要があることはわかっていますが、わかりませんでした。問題は、ピンを最初にロードしたときは問題なく、2 回目は画像がめちゃくちゃになることです。推奨事項はありますか?

4

1 に答える 1

4

MKPinAnnotationView をデキューしたときに何が起こっているかとして、if/else ブロックの外側に次のコード行を実装することをお勧めします。それがビューを返す場合は、まだ古いイメージを参照しているデキューされたビューを返すだけです。

したがって、その直後に if/else の外側に画像を設定する必要があります。次のようになります。

if (pinView == nil)
{
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    pinView.canShowCallout = YES;
}

pinView.image = [UIImage imageNamed:[(Annotation*)annotation annotationImg]];
于 2013-06-28T21:40:39.087 に答える