长按MKPointAnnotation时,我发现了一些奇怪的行为。

我这样创建我的图钉:

MKPointAnnotation *activeTRPoint = [[MKPointAnnotation alloc] init];
CLLocation *coord = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
activeTRPoint.coordinate = coord.coordinate;
activeTRPoint.title = @"Title";
activeTRPoint.subtitle = @"subtitle";
//Added tag
[map addAnnotation:activeTRPoint];
[[map viewForAnnotation:activeTRPoint] setTag:1];
UIImage *im = [UIImage imageNamed:@"pin_icon.png"];
[[map viewForAnnotation:activeTRPoint] setImage:im];


因此,当我长按该图钉时,它会变为红色图钉(默认)。你知道为什么会这样吗?

更新:添加了viewForAnnotation方法以供进一步研究

- (MKAnnotationView *) mapView:(MKMapView *)mapView1 viewForAnnotation:(id <MKAnnotation>) annotation
{
    if(annotation != map.userLocation){
        // This is not the users location indicator (the blue dot)
        MKAnnotationView *view = [map dequeueReusableAnnotationViewWithIdentifier:@"myAnnotationIdentifier"];
        BOOL isCustomPin = [subtitles containsObject:((MKPointAnnotation*)annotation).subtitle];
        if (!view && isCustomPin == NO) {
            // Creating a new annotation view, in this case it still looks like a pin
            MKPinAnnotationView *annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotationIdentifier"];
            annView.pinColor = MKPinAnnotationColorGreen;
            view = annView;
            view.canShowCallout = YES; // So that the callout can appear
            UIButton *btnViewVenue = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            [btnViewVenue addTarget:self action:@selector(pinTouched:) forControlEvents:UIControlEventTouchUpInside];
            view.rightCalloutAccessoryView = btnViewVenue;
            view.enabled = YES;
            view.canShowCallout = YES;
            view.multipleTouchEnabled = NO;
        }else{
            UIImage *im = [UIImage imageNamed:@"pin_icon.png"];
            [view setImage:im];
        }
        return view;
    }else{
        mapView1.userLocation.title = [Lang get:@"USER_CURRENT_LOCATION"];
        mapView1.userLocation.subtitle = @"";
        [mapView1 setTag:999];
        return nil;
    }
}

最佳答案

在所示的viewForAnnotation委托方法中,实际创建的唯一注释视图类型(alloc + init)是MKPinAnnotationView

isCustomPinYES时,原样的代码实际上不会创建MKAnnotationView,因此最终引用了view


nil因为dequeue没有返回任何内容,或者
MKPinAnnotationView,因为这是有史以来创建的唯一视图类型,出队返回其中一个先前使用的视图。


因此,当isCustomPinYES时:


它返回一个nil视图,地图视图将其解释为“显示默认红色图钉”(基本上是红色的MKPinAnnotationView),或者
返回绿色MKPinAnnotationView


无论如何,代码总是返回一个MKPinAnnotationView,地图视图通常会忽略该image属性,并根据pinColor显示默认的针脚图像。


为了解决这个问题,您必须将“自定义图像”图钉与“绿色图钉”的创建和重复使用分开。例如:

BOOL isCustomPin = [subtitles containsObject:((MKPointAnnotation*)annotation).subtitle];

if (isCustomPin)
{
    //Put dequeue and alloc+init of MKAnnotationView here.
    //NOTE: Use a DIFFERENT re-use identifier for "custom image" pins.
    //Eg. Use "myCustomIdentifier" -- not "myAnnotationIdentifier"
}
else
{
    //Put dequeue and alloc+init of MKPinAnnotationView here.
    //NOTE: Use a DIFFERENT re-use identifier from "custom image" pins.
    //That is, use "myAnnotationIdentifier" -- not "myCustomIdentifier".
}



一些单独的,可能不相关的问题:


用于确定isCustomPin的逻辑看起来值得怀疑。最好创建一个自定义注释类,并检查annotation是否属于该类型,而不是在某些外部数组中查找注释。
使注释视图出队后,应将视图的annotation属性设置为当前的annotation,否则该视图将使用以前的注释属性。
应该没有必要使用标签(我不建议这样做)。用户位置注释可以通过其类MKUserLocation进行标识,并且在pinTouched:方法中,可以使用selectedAnnotationsMKMapView属性获取所选注释。



顺便说一句,您还应该在调用addAnnotation之后删除图像的设置。

关于ios - 长按MKPointAnnotation变为红色图钉,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17832667/

10-12 04:22