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;
}
}

现在在不同的按钮按下时,会显示不同的引脚(带有自定义图像)。假设我有绿色、蓝色、黑色和黄色的别针。我按下按钮显示绿色引脚,然后是蓝色,然后是黑色,所有引脚都显示在各自的图像中。但是当我按下按钮以显示用户当前位置时,所有 Pins 都变为最后一次按下的 Pin,即黑色。

这是显示用户当前位置的代码:

- (IBAction)currentLocationButton:(id)sender {

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

}

谁能指出我在做什么错?

谢谢大家 :)

4

2 回答 2

2

您的注释需要包含一些可用于在 viewForAnnotation 中设置其颜色的内容。MKAnnotation 协议将所有注释定义为具有标题、副标题和坐标。如果标题和副标题不足以确定您想要的 pin 的颜色,请编写您自己的类并添加一个名为 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 的值设置图像,这就是为什么您的所有引脚都重绘为最后选择的颜色的原因。如果你还在你的 pin 上设置了一个 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 回答