0

我对 mapView 中的注释有一些问题。让我们看一下我的要求。

我想让用户选择会议地点。

有两种选择。

1)我应该列出附近的数据

或者

2)他可以将图钉拖放到任何他想要的地方!

为此,我创建了一个细分市场。附近数据的第一个索引和删除 pin 的第二个索引。

对于第一个选项(“附近”),我需要从卖方位置、买方位置以及卖方和买方之间的中点获取附近的数据。所以我调用google api并通过传递纬度和经度三次来获取数据。第一次获取数据时没有问题。我的数组填满了所有数据(包括 3 个响应),并且引脚颜色也会根据要求发生变化。

买方(红色)卖方(紫色)中点(绿色)

现在,当我单击放置引脚时,所有数据都会从数组中删除,并且在地图上放置一个引脚。

到现在为止它工作正常!

但是,当您再次单击“附近”时,问题就开始了!毫无疑问,它可以为我提供我想要的数据,但不会保留别针颜色。

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

    if ([segmentND selectedSegmentIndex]==0) {

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

       static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
        MKPinAnnotationView* pinView = (MKPinAnnotationView *)
        [myMapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
        if (!pinView)
        {
            MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
                                                   initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];

            switch (self.pinColor) {
                case 0:
                {
                    customPinView.pinColor = MKPinAnnotationColorPurple;
                }
                    break;
                case 1:
                {
                    customPinView.pinColor = MKPinAnnotationColorRed;
                }
                    break;
                case 2:
                {
                    customPinView.pinColor = MKPinAnnotationColorGreen;
                }
                    break;
                default:
                    break;
            }
            customPinView.canShowCallout = YES;

            UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];


            [rightButton addTarget:self
                            action:@selector(showDetails:)
                  forControlEvents:UIControlEventTouchUpInside];
            customPinView.rightCalloutAccessoryView = rightButton;

            return customPinView;
        }
        else
        {
            pinView.annotation = annotation;
        }
        return pinView;
    }
    else {

        // Code of dragging dropping pin. It works Fine.s
    }
}

我附上图片以获得更多想法。

请给我解决方案或任何其他方式来实现它。记住别针颜色是区分卖方买方和中点的必要条件!

4

4 回答 4

1

您当前方法的问题在于 self.pinColor 不会根据地图需要查看的注释而改变。它可以并且会在任何时候调用 viewForAnnotation 。也许地图已经滚动,一个大头针刚刚回到视野中。也许应用程序被置于后台,只是被用户重新带回视图。您需要分析注释的原因是传递以确定在视图中使用哪种引脚颜色。您使用什么对象进行注释?如果它是 HAnno 并且它有一个名为 pinColor 的属性,你会做这样的事情而不是你的 switch 语句。

HSAnno* currentAnno = (HSAnno *)annotation;
pinView.pinColor = currentAnno.pinColor;

这样,无论需要重绘什么注释, viewForAnnotation 总是会返回正确的彩色图钉。

于 2012-08-31T20:15:13.923 回答
0

当不存在可重复使用的 pin 时,您在该代码部分设置 pincolor。

if (!pinView)
    ....
    customPinView.pinColor = MKPinAnnotationColorPurple;
    ....
}

viewForAnnotation被调用并找到可重复使用的引脚时,它们就会被使用。那里有错误的颜色引脚。

else
{
    pinView.annotation = annotation;
}

部分,它应该可以正常工作。

于 2012-08-31T07:42:37.180 回答
0

认为这里弄错了

    else
    {
        pinView.annotation = annotation;
    }
    return pinView;

改正为

    else
    {
        pinView.annotation = annotation;        
        return pinView;
    }
于 2012-08-31T07:50:32.457 回答
0

这是我对您的代码和MKMapView委托进行的少量修改。以前,您已经更改了pin内部颜色if,使其在第一次MKMapView加载时只调用一次。

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{            
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)
    [mapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
    if (!pinView)
    {
        pinView = [[[MKPinAnnotationView alloc]
                                            initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];
    }
    else
    {
        pinView.annotation = annotation;
    }

    switch (self.pinColor) {
        case 0:
        {
            pinView.pinColor = MKPinAnnotationColorPurple;

        }
            break;
        case 1:
        {
            pinView.pinColor = MKPinAnnotationColorRed;
        }
            break;
        case 2:
        {
            pinView.pinColor = MKPinAnnotationColorGreen;
        }
            break;
        default:
            break;

    pinView.canShowCallout = YES;

    UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];


    [rightButton addTarget:self
                    action:@selector(showDetails:)
          forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    return pinView;
}

    return pinView;
}

PS我已经删除了您UISegment在我身边检查的第一个条件,请在实施时按原样添加。

于 2012-08-31T07:54:32.317 回答