iOS MapClustering:CCHMapClusterController:放大后缩小时出现的问题。单个注释显示集群注释标注

时间:2014-02-19 20:00:23

标签: ios mkannotation mkannotationview

我正在尝试这个名为CCHMapClusterConroller的注释聚类的新库。 我觉得这里很少或根本没有帮助,因为图书馆很新,但我会试一试。

我在注释标注方面遇到问题,我不知道自己做错了什么。 当我进入视图控制器视图时,注释完全聚集。 当我然后放大我的注释时,它们会按预期进行分组。

然而,当我缩小并且注释开始再次分组到群集时,某些群集具有单个注释的图像。他们的标注同样如此。它们具有我的聚类注释的标题和副标题,但是它们具有我只分配给单个非聚集注释的公开按钮。

这是我初始化集群控制器的方法: ...

// viewDidLoad

    self.mapClusterController = nil;
    self.mapClusterController = [[CCHMapClusterController alloc]     initWithMapView:self.mapView];
    self.mapClusterController.delegate = self;
    self.mapClusterController.cellSize = 25;
    self.mapClusterController.marginFactor = 0.4;
//
...

这就是我用自己的自定义注释填充控制器的方法:

//...

[self.mapClusterController removeAnnotations:[self.mapClusterController.annotations     allObjects] withCompletionHandler:nil];
    NSMutableArray *arrayWithAnnotations = [[NSMutableArray alloc] init];
    FFMapAnnotation *annotation;
    for(FFPlace *place in self.searchResult){
        annotation = [[FFMapAnnotation alloc] init];
        annotation.title = place.placeName;
        annotation.coordinate = CLLocationCoordinate2DMake(place.placeLatitude,     place.placeLongitude);
        annotation.place = place;
        annotation.subtitle = place.placeAddress;
        [arrayWithAnnotations addObject:annotation];
    }
    [self.mapClusterController addAnnotations:arrayWithAnnotations     withCompletionHandler:nil];
//...

现在,我相信这两种方法都能正常工作。 我想问题就在于viewForAnnotation方法。

目前看起来如此:

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

if ([annotation isKindOfClass:CCHMapClusterAnnotation.class]) {
    static NSString *identifier = @"clusterAnnotation";

    annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView) {
        annotationView.annotation = annotation;
    } else {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        annotationView.canShowCallout = YES;
    }

    CCHMapClusterAnnotation *clusterAnnotation = (CCHMapClusterAnnotation *)annotation;
    clusterAnnotation.delegate = self;
    if(!clusterAnnotation.isCluster){
        FFMapAnnotation *annot2 = (FFMapAnnotation*)clusterAnnotation.annotations.allObjects[0];
        annotationView.image = [UIImage imageNamed:[DefinedCategories getCategoryInformationForID:annot2.place.placeMainCategoryID].mapImage];
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
        annotationView.rightCalloutAccessoryView.tag = -1;
    }else {
        return nil;
    }

}

return annotationView;
}

// the return nil at the end makes the annotation view a regular MKPinAnnotationView, which I use to visually represent my clusters.

最后,群集标题和副标题的两个委托方法如下所示:

- (NSString *)mapClusterController:(CCHMapClusterController *)mapClusterController     titleForMapClusterAnnotation:(CCHMapClusterAnnotation *)mapClusterAnnotation
{
    NSString *title;
    if(mapClusterAnnotation.annotations.count > 1){
        title = [NSString stringWithFormat:@"%ld %@", (unsigned long)      mapClusterAnnotation.annotations.count, [AppDelegate get:@"PLACES"alter:nil]];
    } else{
        FFMapAnnotation *annotation =  mapClusterAnnotation.annotations.allObjects[0];
        return annotation.title;
    }
    return title;
}    

- (NSString *)mapClusterController:(CCHMapClusterController *)mapClusterController     subtitleForMapClusterAnnotation:(CCHMapClusterAnnotation *)mapClusterAnnotation
{
    NSString *title;
    if(mapClusterAnnotation.annotations.count > 1){
        title = [AppDelegate get:@"ZOOM_FURTHER"alter:nil];
    } else{
        FFMapAnnotation *annotation = mapClusterAnnotation.annotations.allObjects[0];
        return annotation.subtitle;
    }
    return title;
}

我想要的是什么:

enter image description here enter image description here

发生了什么:

enter image description here

我是否遗漏了委托方法中的重要内容?我整天都在调试它。

修改 添加委托方法

- (void)mapClusterController:(CCHMapClusterController *)mapClusterController willReuseMapClusterAnnotation:(CCHMapClusterAnnotation *)mapClusterAnnotation
{
    MKAnnotationView *annotationView = [_mapView viewForAnnotation:mapClusterAnnotation];
    if(!(mapClusterAnnotation.annotations.count == 1)){
        annotationView.image = [UIImage imageNamed:@"map_icon_button_thing"];
        annotationView.rightCalloutAccessoryView = nil;
    }else {
        FFMapAnnotation *annotation = mapClusterAnnotation.annotations.allObjects[0];
        annotationView.image = [UIImage imageNamed:[DefinedCategories getCategoryInformationForID:annotation.place.placeMainCategoryID].mapImage];
    }
}

解决了我的问题!

0 个答案:

没有答案