MKMapView:显示用户当前位置时引脚颜色更改

时间:2012-09-13 15:22:11

标签: iphone ios ios5 mkmapview mkannotation

我有不同位置的自定义图像,我可以同时显示所有不同的图钉。但问题是,当我显示用户的当前位置时,所有引脚颜色都会发生变化。

这是代码:

- (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(带有自定义图像)。让我说我有绿色,蓝色,黑色和黄色的针脚。我按下按钮显示Green Pins,然后按For Blue,然后按Black,所有Pins显示在各自的图像中。但是,当我按下按钮显示用户当前位置时,所有引脚都会更改为最后一次按下引脚,即黑色。

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

- (IBAction)currentLocationButton:(id)sender {

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

}

有人能指出我做错了吗?

谢谢大家:)

2 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分: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; 
.
.
.
}