1

パーサーxmlから定義された多くの注釈ピンを持つMKMapViewがあります。それは私のコードです:

-(IBAction)LoadAnnotation:(id)sender {

    RXML element ...
    RXML iterate....

    [myMap removeAnnotations:myMap.annotations];
    annotation.title = // NSString from RXML parser
    annotation.subtitle = // NSString from RXML parser
    myValue = // float value from RXML parser
    [mymap addAnnotation:annotation];
}

その後

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

       MKPinAnnotationView *pinView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation2 reuseIdentifier:@"MyPin"];

        if ( myValue > 0 && myValue < 10) {
            pinView.canShowCallout = YES;
            pinView.pinColor = MKPinAnnotationColorRed;
            pinView.animatesDrop=YES;
            return pinView;
        }

        else if ( myValue > 10 && myValue < 20 ) {
        pinView.canShowCallout = YES;
        pinView.pinColor = MKPinAnnotationColorGreen;
        pinView.animatesDrop=YES;
        return pinView;
    }

        pinView.canShowCallout = YES;
        pinView.pinColor = MKPinAnnotationColorPurple;
        pinView.animatesDrop=YES;
        return pinView;
}

MKMapView が読み込まれると、タイトル アノテーション、サブタイトル アノテーション、およびすべてのピンが異なる色で表示されます。

しかし、マップをスクロールして特定のレベルでズームインし、再度ズームアウトすると、すべてのピンが紫色になります。そこで何が起こっているのですか?

2 つのメソッド (「annotation」と「annotation2」ではなく) で同じ「annotation」(id) も使用しようとしましたが、結果はありません。

それを回避し、マップのスクロールとズーム後に pinColors を保持する方法はありますか?

4

1 に答える 1

1

デリゲート メソッドは、viewForAnnotation必ずしも各注釈に対して 1 回だけ呼び出されるわけではなく、注釈を追加した順序で呼び出されるとは限りません。showsUserLocationに設定すると、ユーザーの場所 (青い点) に対しても呼び出されますYES

マップをズームまたはパンすると、注釈がビューに戻ると、マップ ビューはデリゲート メソッドを (再び) 呼び出します。その時点でmyValue、地図がビューをリクエストしている注釈とあなたの意志は無関係です。

クラス レベルの ivar を使用する代わりに、アノテーション クラスのプロパティとして追加myValueし、を呼び出す前にtitleandと共に設定します。subtitleaddAnnotation

annotation.title = // NSString from RXML parser
annotation.subtitle = // NSString from RXML parser
annotation.myValue = // float value from RXML parser
^^^^^^^^^^^

次に、ivar の代わりにパラメータのプロパティをviewForAnnotation使用します。このように、デリゲート メソッドは、ビューを要求しているアノテーションに固有の情報を常に使用します。myValueannotation

if ( ! [annotation isKindOfClass:[MyCustomAnnotationClass class]])
{
    return nil;  //return a default view if not your custom class
}

//cast annotation to custom class so we can get the custom property...
MyCustomAnnotationClass *myPin = (MyCustomAnnotationClass *)annotation;

//use the custom property in the annotation instead of ivar...
if (myPin.myValue > 0 && myPin.myValue < 10) {
    ....

annotationパラメータの名前を に変更するannotation2必要はありません。


無関係ですが、使用して注釈ビューの再利用を実装する必要がありますdequeueReusableAnnotationViewWithIdentifier(SDKまたはSOで検索してください)。注釈が多数ある場合は、パフォーマンスが向上する可能性があります。


クラスMyAnnotationは次のようになります。

@interface MyAnnotation : NSObject <MKAnnotation> {
    float myValue;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate; //<-- add
@property (nonatomic, copy) NSString *title;                     //<-- add
@property (nonatomic, copy) NSString *subtitle;                  //<-- add
@property (nonatomic, assign) float myValue;
@end

@implementation MyAnnotation
@synthesize coordinate; //<-- add
@synthesize title;      //<-- add
@synthesize subtitle;   //<-- add
@synthesize myValue;
@end

注釈を追加する場所は次のようになります。

MyAnnotation *annotation = [[MyAnnotation alloc] init];
annotation.title = someTitle;       // NSString from RXML parser
annotation.subtitle = someSubTitle; // NSString from RXML parser
annotation.myValue = someValue;     // someValue from RXML parser
[mapView addAnnotation:annotation];

上記someValuemyValue、元のViewController.

また、 では にviewForAnnotation戻りannotation2、行の前annotationに置くことを忘れないでください。MKPinAnnotationView *pinView =[[MKPinAnnotationView alloc] init...MyAnnotation *myPin = ...

于 2012-10-09T17:21:59.003 に答える