0

I have already managed to use interactive offline mbtiles (created on TileMill) in order to:

  • Load more than 1000 points fast
  • Make them understand when user is clicking each point and show a popup with the name of each point

But I can't make the bubble with the name clickable again.

I use the following code to generate the layer for the annotation of each point

- (RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation{

    RMMarker *marker = [[RMMarker alloc] initWithMapboxMarkerImage:@"embassy"];

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 32)];

    imageView.contentMode = UIViewContentModeScaleAspectFit;

    imageView.image = annotation.userInfo;

    marker.leftCalloutAccessoryView = imageView;

    marker.canShowCallout = YES;

    return marker;
}

and this is how I get the teaser and build my annotation from the mbtiles file:

- (void)singleTapOnMap:(RMMapView *)mapView at:(CGPoint)point{
    [mapView removeAllAnnotations];

    RMMBTilesSource *source = (RMMBTilesSource *)mapView.tileSource;

    if ([source conformsToProtocol:@protocol(RMInteractiveSource)] && [source supportsInteractivity])
    {
        NSString *formattedOutput = [source formattedOutputOfType:RMInteractiveSourceOutputTypeTeaser
                                                         forPoint:point
                                                        inMapView:mapView];

        if (formattedOutput && [formattedOutput length])
        {
            // parse the country name out of the content
            //
            NSUInteger startOfCountryName = [formattedOutput rangeOfString:@"<strong>"].location + [@"<strong>" length];
            NSUInteger endOfCountryName   = [formattedOutput rangeOfString:@"</strong>"].location;

            NSString *countryName = [formattedOutput substringWithRange:NSMakeRange(startOfCountryName, endOfCountryName - startOfCountryName)];

            // parse the flag image out of the content
            //
            NSUInteger startOfFlagImage = [formattedOutput rangeOfString:@"base64,"].location + [@"base64," length];
            NSUInteger endOfFlagImage   = [formattedOutput rangeOfString:@"\" style"].location;

            UIImage *flagImage = [UIImage imageWithData:[NSData dataFromBase64String:[formattedOutput substringWithRange:NSMakeRange(startOfFlagImage, endOfFlagImage)]]];

            RMAnnotation *annotation = [RMAnnotation annotationWithMapView:mapView coordinate:[mapView pixelToCoordinate:point] andTitle:countryName];

            annotation.userInfo = flagImage;

            [mapView addAnnotation:annotation];

            [mapView selectAnnotation:annotation animated:YES];
        }
    }
}

UPDATED I figured out how to do that by using a leftCalloutAccessoryView on the marker (I added the following at the end of layerForAnnotation method :

marker.leftCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

and used the following delegate method to track the event:

-(void)tapOnCalloutAccessoryControl:(UIControl *)control forAnnotation:(RMAnnotation *)annotation onMap:(RMMapView *)map{
    NSLog(@"I will now pass to the next screen !  YEAH! %@",annotation.title);
}

The problem now is that I want to get rid off the left calloutAccesoryView. Any suggestions?

modusCell
  • 13,151
  • 9
  • 53
  • 80
arniotaki
  • 2,175
  • 2
  • 23
  • 26

1 Answers1

0

None of what you have here about the map is needed. What you really want is the callout (which is of type SMCalloutView, a dependent project to the Mapbox SDK that you are using) to have its clicks registered.

Check out this issue for more details:

https://github.com/mapbox/mapbox-ios-sdk/issues/422

incanus
  • 5,100
  • 1
  • 13
  • 20
  • You mean that I do not even need the teaser in my map? I will check it and let you know if that solved my problem – arniotaki Aug 19 '14 at 09:51