1

次のように、いくつかの注釈を追加するマップがあります。

    for (Users *user in mapUsers){

        double userlat = [user.llat doubleValue];
        double userLong = [user.llong doubleValue];

        CLLocationCoordinate2D userCoord = {.latitude =  userlat, .longitude =  userLong};

        MapAnnotationViewController *addAnnotation = [[MapAnnotationViewController alloc] initWithCoordinate:userCoord];

        NSString *userName = user.username;
        NSString *relationship = user.relationship;

        [addAnnotation setTitle:userName];
        [addAnnotation setRelationshipParam:relationship];

        [self.mainMapView addAnnotation:addAnnotation];
    }

このデリゲート メソッド コードを使用すると、次のようになります。

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    static NSString *identifier = @"AnnotationIdentifier";

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

    MKAnnotationView *annView = (MKAnnotationView *)[self.mainMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (!annView) {
        annView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                          reuseIdentifier:identifier];
    }
    MapAnnotationViewController *sac = (MapAnnotationViewController *)annView.annotation;

    if ([sac.relationshipParam isEqualToString:@"paramA"])
    {
        annView.image = [UIImage imageNamed:@"image1.png"];
    }
    else if ([sac.relationshipParam isEqualToString:@"paramB"])
    {
        annView.image = [UIImage imageNamed:@"image2.png"];
    }
    else if ([sac.relationshipParam isEqualToString:@"paramC"])
    {
        annView.image = [UIImage imageNamed:@"image3.png"];
    }


    return annView;
}
else {
    return nil;
}

これはすべて、マップの元の読み込みで正常に機能します。ただし、注釈 (投稿するには長すぎるがズームインを含むカスタム コードがある) を選択すると、以前に描画された注釈画像のアイコンが変更されました。マップは再描画されず、そのプロセスで注釈が再追加されません。マップをピンチアウトすると、画像が異なります (不適切な関係パラメーターと不適切な image1-3.png が一致しています。

なぜこれが起こっているのか、何を探すべきなのか、誰でも考えられますか?

4

1 に答える 1

6

は、現在のパラメータdequeueReusableAnnotationViewWithIdentifierとは異なる注釈に使用された注釈ビューを返す場合があります。annotation

が成功した場合dequeueReusableAnnotationViewWithIdentifier(つまり、以前に使用した注釈ビューを使用している場合)、そのannotationプロパティを更新して、ビューが現在の のプロパティと一致するようにする必要がありannotationます。

したがって、この部分を変更してみてください。

MKAnnotationView *annView = (MKAnnotationView *)[self.mainMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!annView) {
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                      reuseIdentifier:identifier];
}
MapAnnotationViewController *sac = (MapAnnotationViewController *)annView.annotation;

に:

MKAnnotationView *annView = (MKAnnotationView *)[self.mainMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!annView) {
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                      reuseIdentifier:identifier];
}
else {
    annView.annotation = annotation; // <-- add this
}

MapAnnotationViewController *sac = (MapAnnotationViewController *)annView.annotation;


別の潜在的な問題 (問題の問題を引き起こさない) は、ビューのプロパティが3 つの値のいずれ かであるimage場合にのみ設定されることです。relationshipParam

何らかの形relationshipParamでこれら 3 つのコード化された値の 1 つではなくビューがキューから取り出された場合、画像は他の注釈の に基づいていrelationshipParamます。

したがって、念のelseため、設定するセクションにパーツを追加しimageて、デフォルトの画像に設定する必要があります。

...
else if ([sac.relationshipParam isEqualToString:@"paramC"])
{
    annView.image = [UIImage imageNamed:@"image3.png"];
}
else
{
    annView.image = [UIImage imageNamed:@"UnknownRelationship.png"];
}
于 2012-12-13T22:59:12.517 に答える