0

さまざまな場所のカスタムピン画像があり、すべてのさまざまなピンを同時に表示できます。しかし、問題は、ユーザーの現在の場所を表示すると、すべてのピンの色が変わることです。

ここにコードがあります:

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

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

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

    MKAnnotationView *test=[[MKAnnotationView alloc] 
                            initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"];

    test.canShowCallout = YES;
    //        test.animatesDrop = YES;


    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    test
    .rightCalloutAccessoryView = rightButton;

    switch (_pushpinTag) {
        case 5:
            test.image = [UIImage imageNamed:@"pushpin_green.png"];
            break;

        case 6:
            test.image = [UIImage imageNamed:@"pushpin_blue.png"];
            break;

        case 7:
            test.image = [UIImage imageNamed:@"pushpin_black.png"];
            break;

        case 8:
            test.image = [UIImage imageNamed:@"pushpin_yellow.png"];
            break;

        case 3:
            test.image = [UIImage imageNamed:@"pushpin_red.png"];
            break;

        default:
            break;
    }

    return test;
}
}

別のボタンを押すと、別のピン(カスタム画像付き)が表示されます。緑、青、黒、黄色のピンがあるとしましょう。ボタンを押して緑のピンを表示し、次に青の場合、次に黒の場合、すべてのピンがそれぞれの画像に表示されます。しかし、ボタンを押してユーザーの現在の場所を表示すると、すべてのピンが最後に押したピン(黒)に変わります。

ユーザーの現在地を表示するコードは次のとおりです。

- (IBAction)currentLocationButton:(id)sender {

_mapView.showsUserLocation = YES;
[_mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];

}

誰かが私が何が間違っているのか指摘できますか?

みんなありがとう :)

4

2 に答える 2

2

注釈には、viewForAnnotationで色を設定するために使用できるものが含まれている必要があります。MKAnnotationプロトコルは、すべての注釈をタイトル、サブタイトル、および座標を持つように定義します。タイトルとサブタイトルだけではピンを使用する色を決定できない場合は、独自のクラスを作成し、pinTypeというプロパティを追加します。次に、ユーザーが押したボタンに応じて注釈セットpinTypeを作成します。viewForAnnotationが呼び出されたら、通常のdequeueReusableAnnotationViewWithIdentifier / initWithAnnotationを実行してビューを準備し、提供されたアノテーションをクラスにキャストし、そのpinTypeを使用して画像を設定します。ここにいくつかのテストされていないコードがあります、あなたにアイデアを与えるのに十分です

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MyAnnotation class]])
    {
        MyAnnotation* myAnno = (MyAnnotation)annotation;
        MKAnnotationView *test;

        test = (MKAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationIdentifier"];
        if (view == nil)
        {
            test=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"]; 
        } 
        switch(myAnno.pinType)
        {
            case kBLACK_TAG: test.image = [UIImage imageNamed:@"pushpin_black.png"]; 
                             break;
        }
    }
}
于 2012-09-13T21:15:51.843 に答える
1

再利用可能なビューを利用していません

MKAnnotationView *test;

test = (MKAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationIdentifier"];
if (view == nil)
{
 test=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"]; 
 test.tag = _pushpinTag;    // set tag of new pins to _pushpinTag
} 

第二に、あなたの一般的なエラーは論理エラーです。iOSが注釈ビューを要求するときは常に、_pushpinTagの値に基づいて画像を設定します。これが、すべてのピンが最後に選択された色として再描画される理由です。ピンにTAG値も設定した場合は、次のようになります。

static int kGREEN_TAG = 5;
static int kBLUE_TAG = 6;
static int kBLACK_TAG = 7;
static int kYELLOW_TAG = 8;

switch (test.tag)
{
 case kBLACK_TAG:
            test.image = [UIImage imageNamed:@"pushpin_black.png"]; 
            break; 
.
.
.
}
于 2012-09-13T16:01:06.057 に答える