2

注釈マップを使用し、ピンに複数の画像を使用しましたが、ズームインまたはズームアウトするたびに、すべてのピンが 1 つの画像に変わります。

Web サービスから場所を取得し、それらを認識するために、文字列 ( CustAttr) を "T" または "P" として使用しました。

問題は、Web サービスからの最後の呼び出しが行われCustAttr = T、ズームインまたはズームアウトすると、mapViewviewForAnnotationメソッドが呼び出されてすべてが描画されT、すべてのPピンが変更されることです。

メソッドのコードは次のとおりです。

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

if ([annotation isKindOfClass:[MKUserLocation class]]) {
    return nil;

}
static NSString* AnnotationIndentifer = @"AnnotationIdentifier";



if ([custAttr isEqualToString:@"T"]) // ATMs
{
    MKAnnotationView* pinView;
    pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIndentifer];

    MapAnnotation* mapAnnotation = annotation;
    pinView.canShowCallout = YES;

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
    pinView.rightCalloutAccessoryView = rightButton;

    if (mapAnnotation.isClosest) {
        pinView.image = [UIImage imageNamed:@"Closest_ATM.png"];

    }
    if (mapAnnotation.isOffline) {
        pinView.image = [UIImage imageNamed:@"Offline_ATM.png"];
    }
    pinView.annotation = annotation;
    return pinView;        

}else if ([custAttr isEqualToString:@"P"]) // POIs
{
    MKAnnotationView* pinView;
    pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIndentifer];

    pinView.canShowCallout = YES;
    pinView.image = [UIImage imageNamed:@"Location_POI.png"];
    pinView.annotation = annotation;
    return pinView;
}

return nil;
}

この問題を解決するにはどうすればよいですか? ズームイン/ズームアウト時にこのメソッドを呼び出さないようにする方法はありますか、または同じ画像のように再度描画させる別の方法はありますか?

4

1 に答える 1

0

変数 (デリゲート メソッドの外部で設定する) は、デリゲート メソッドが呼び出される対象とcustAttr常に同期するとは限りません。annotationviewForAnnotation

デリゲート メソッドは、必ずしもaddAnnotationまたはの直後に呼び出されるとは限りませんaddAnnotations。ズームまたはパンの後にマップでアノテーション ビューを再度表示する必要がある場合は、アノテーションごとに複数回呼び出すことができます。

同じ注釈に対して再度呼び出されると、custAttr変数は一致しなくなります。


custAttrクラスにプロパティ を追加し(別の名前を使用することをお勧めします) MapAnnotation、注釈を作成するときに(を呼び出す前にaddAnnotation)設定する必要があります。

例えば:

MapAnnotation *ann = [[MapAnnotation alloc] init];
ann.coordinate = ...
ann.title = ...
ann.subtitle = ...
ann.custAttr = custAttr; // <-- copy to the annotation object itself
[mapView addAnnotation:ann];


次に、 で、外部で宣言された を参照する代わりに、パラメータからプロパティを( にキャストした後)viewForAnnotation読み取ります。custAttrannotationMapAnnotation *custAttr

混乱を避けるために、custAttrプロパティに別の名前を使用することをお勧めします。MapAnnotation

于 2012-12-06T14:16:36.697 に答える