1

たくさんの注釈を追加し、それらを配列に入れて、新しい場所を取得し、それに応じてマップを更新できるようにします。最初にすべての注釈を削除して追加すると、ちらつきが発生します。残念ながら、それらの座標が最初に設定されて追加された後は、setCoordinate呼び出しは機能しなくなります。何か案は?

- (void)updateMap:(NSData *)responseData {
    //parse out the JSON data
    NSError* error;
    vehicleData = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    //find which Dictionary is for our bus.
    for (NSDictionary* route in vehicleData) {
        //find our bus in our vehicles dictionary. Key is by routeID.
        BusPositionDot *busLocationDot; 
        if ([vehicles objectForKey:[route objectForKey:@"RouteID"]] == nil) {
            busLocationDot = [[BusPositionDot alloc] init];
            [vehicles setObject:busLocationDot forKey:[route objectForKey:@"RouteID"]];
            [mapView addAnnotation:[vehicles objectForKey:[route objectForKey:@"RouteID"]]];

        }
        else {
            busLocationDot = [vehicles objectForKey:@"RouteID"];
        }

        float latitude = [[route objectForKey:@"Latitude"] floatValue];
        float longitude = [[route objectForKey:@"Longitude"] floatValue];
        float groundSpeed = [[route objectForKey:@"GroundSpeed"] floatValue];
        float direction = [[route objectForKey:@"Heading"] floatValue];

        float roundedDirection=45 * round(direction/45);

        if(groundSpeed<=3)
            //get view for annotation
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot.png"];
        else if((roundedDirection==0)||(roundedDirection==360))
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot0.png"];
        else if(roundedDirection==45)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot45.png"];
        else if(roundedDirection==90)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot90.png"];
        else if(roundedDirection==135)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot135.png"];
        else if(roundedDirection==180)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot180.png"];
        else if(roundedDirection==225)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot225.png"];
        else if(roundedDirection==270)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot270.png"];
        else if(roundedDirection==315)
            [mapView viewForAnnotation:busLocationDot].image=[UIImage imageNamed:@"buspositiondot315.png"];

        CLLocationCoordinate2D currentBusLocation = CLLocationCoordinate2DMake(latitude, longitude);
        NSLog(@"setting coord %f & %f",currentBusLocation.latitude,currentBusLocation.longitude);

        [UIView animateWithDuration:0.5 animations:^{
            [busLocationDot setCoordinate:currentBusLocation];

        }];
    }
}
4

1 に答える 1

2

この部分に関連して:

if ([vehicles objectForKey:[route objectForKey:@"RouteID"]] == nil) {
    ...
    [mapView addAnnotation:
        [vehicles objectForKey:[route objectForKey:@"RouteID"]]];
}
else {
    busLocationDot = [vehicles objectForKey:@"RouteID"];
}

あなたが電話するときaddAnnotation、あなたは合格します:

[vehicles objectForKey:[route objectForKey:@"RouteID"]]

ただし、すでに存在する場合は、次を使用します。

[vehicles objectForKey:@"RouteID"]

これは、注釈を更新するときに、別の(おそらく間違った)参照が使用されていることを意味します。実際にはではない
か、その「ルートID」で最初に追加されたのと同じインスタンスではありません。 [vehicles objectForKey:@"RouteID"]BusPositionDot

したがって、はsetCoordinate機能しません。
注釈を更新するときに同じ参照を使用すると、修正されるはずです。



他にも、無関係で潜在的な問題がいくつかあります。

  • コードは、float変数(例if(roundedDirection==45))を使用して直接比較を行っています。これは「機能しているように見える」場合でもお勧めできません。浮動小数点の精度エラーが発生する可能性があります。roundedDirectionがターゲット値の非常に狭い範囲内にあるかどうかを確認するか、場合は、式が小数部のない値のみを返すように見えるため、roundedDirectionとして宣言します。int
    45 * round(direction/45)

  • コードはimage、注釈ビューのを直接設定しています。これは問題ありませんが、viewForAnnnotationデリゲートメソッドにも、image方向に基づいて設定するための同じ正確なロジックがあることを確認してください。そうでない場合、パンまたはズーム時にアノテーションビューの画像がデフォルトにリセットされます。directionにプロパティを追加する必要がある場合がありますBusPositionDot

于 2012-12-03T18:39:37.153 に答える