IOS MapClustering: CCHMapClusterController: problems with scaling after scaling. Individual annotations show cluster annotation leaders

I am testing this new awesome annotation clustering library called CCHMapClusterConroller. I believe that little or no help here, as the library is so new, but I will give it a chance.

I'm having problems with annotation leaders, and I don't know what I'm doing wrong. When I enter the view controllers view, annotations are grouped perfectly. When I then enlarge my annotations, they blur as expected.

However, when I zoom in and the annotations begin to cluster again, some clusters have a single annotation image. The same goes for their callouts. They have the names and subtitles of my cluster annotations, but they have a disclosure button that I assigned only to single, unclassified annotations.

Here's how I initialize my cluster controller: ...

// viewDidLoad

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

Here's how I populate the controller with my own annotations:

//...

[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];
//...

Now I believe that these two methods work correctly. I believe the problem is with the viewForAnnotation method.

Currently looks like this:

-(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.

Finally, the two delegate methods for the cluster header and subtitles are as follows:

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

What I want:

enter image description hereenter image description here

What's happening:

enter image description here

Am I missing something vital in delegate methods? I spent all day debugging this.

EDIT:

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

!

+3

All Articles