Question

1) My annotation shows the title and subtitle of not. I have already tried a lot, but I can not.

2) If an annotation has been selected, the annotation will be centered in the middle of the window. So the map is moved. Any idea?

3) My Callout button does not work anymore, I've got the @ selector (openAnything) but I want to use this function is triggered - (void) mapView: (MKMapView *) mapView annotationView: (MKAnnotationView *) view calloutAccessoryControlTapped: (UIControl *) control {

Enough to ask, here's a video and some source code http://www.youtube.com/watch?v=Ur1aqeYEFHw&feature=youtube_gdata_player

Thanks

TAPPMapViewControler.m

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

if ([annotation isKindOfClass:[TAPPMapAnnotation class]])
{
    static NSString *shopAnnotationIdentifier = @"Filiale";

    //pinView = (MKPinAnnotationView *)
    TAPPMapAnnotationCustom* pinView = (TAPPMapAnnotationCustom*)[self.myMapView dequeueReusableAnnotationViewWithIdentifier:shopAnnotationIdentifier];
    [self.myMapView dequeueReusableAnnotationViewWithIdentifier:shopAnnotationIdentifier];
    if (pinView == nil)
    {

        // if an existing pin view was not available, create one
        TAPPMapAnnotationCustom *customPinView = [[TAPPMapAnnotationCustom alloc] initWithAnnotation:annotation reuseIdentifier:shopAnnotationIdentifier];
        customPinView.image          = [UIImage imageNamed:@"map_pin.png"];


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


-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
TAPPMapAnnotation *theAnnotation = view.annotation;
TAPPMapAnnotationDetail *theController = [self.storyboard instantiateViewControllerWithIdentifier:@"MapAnnotationDetail"];
theController.theAnnotationId   = theAnnotation.objectId;
[self.navigationController pushViewController:theController animated:YES];

}

TAPPMapAnnotationCustom.h

#import <MapKit/MapKit.h>

@interface TAPPMapAnnotationCustom : MKAnnotationView

@property (strong, nonatomic) UIImageView *calloutView;
@property (strong, nonatomic) UILabel *title;
@property (strong, nonatomic) UILabel *subTitle;


- (void)setSelected:(BOOL)selected animated:(BOOL)animated;
- (void)animateCalloutAppearance:(BOOL)inAdd;

@end

TAPPMapAnnotationCustom.m

#import "TAPPMapAnnotationCustom.h"
#import "TAPPMapAnnotation.h"

@implementation TAPPMapAnnotationCustom


- (void)setSelected:(BOOL)selected animated:(BOOL)animated{

    [super setSelected:selected animated:animated];

    if(selected)
    {
        // Remove Image, because we set a second large one.
        self.image = Nil;
        UIImage *imageBack = [[UIImage imageNamed:@"map_pin.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 35, 0, 6)];
        self.calloutView = [[UIImageView alloc]initWithImage:imageBack];
        [self.calloutView  setFrame:CGRectMake(0,0,0,0)];
        [self.calloutView  sizeToFit];
        [self addSubview:self.calloutView ];


        // Callout Button
        UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton addTarget:self action:@selector(openAnything) forControlEvents:UIControlEventTouchUpInside];

        rightButton.frame = CGRectMake(0
                                       , ((self.calloutView.frame.size.height-6) / 2)-(rightButton.frame.size.height / 2)
                                       , rightButton.frame.size.width
                                       , rightButton.frame.size.height);

        self.rightCalloutAccessoryView = rightButton;
        self.rightCalloutAccessoryView.hidden = YES;
        self.rightCalloutAccessoryView.alpha = 0;
        [self addSubview:self.rightCalloutAccessoryView];


        // Start Annimation 
        [self animateCalloutAppearance:YES];



    } else {
        //Start Annimation and Remove from view
        [self animateCalloutAppearance:NO];
    }
}


- (void)didAddSubview:(UIView *)subview{

    if ([[[subview class] description] isEqualToString:@"UICalloutView"]) {
        for (UIView *subsubView in subview.subviews) {
            if ([subsubView class] == [UIImageView class]) {
                UIImageView *imageView = ((UIImageView *)subsubView);
                [imageView removeFromSuperview];
            }else if ([subsubView class] == [UILabel class]) {
                UILabel *labelView = ((UILabel *)subsubView);
                [labelView removeFromSuperview];
            }
        }
    }
}


- (void)animateCalloutAppearance:(BOOL)inAdd {

    if (inAdd == YES) {

        self.rightCalloutAccessoryView.hidden = NO;

        [UIView animateWithDuration:0.4 delay:0 options: UIViewAnimationOptionTransitionNone
                         animations:^{

                             self.calloutView.frame = CGRectMake(self.calloutView.frame.origin.x
                                                                 , self.calloutView.frame.origin.y
                                                                 , self.calloutView.frame.size.width+150
                                                                 , self.calloutView.frame.size.height);

                             self.rightCalloutAccessoryView.alpha = 1;
                             self.rightCalloutAccessoryView.frame = CGRectMake(self.calloutView.frame.size.width - (self.rightCalloutAccessoryView.frame.size.width)
                                                                               , self.rightCalloutAccessoryView.frame.origin.y
                                                                               , self.rightCalloutAccessoryView.frame.size.width
                                                                               , self.rightCalloutAccessoryView.frame.size.height);


                         } completion:^(BOOL finished){ }];

    } else {


        [UIView animateWithDuration:0.4 delay:0 options: UIViewAnimationOptionTransitionNone
                         animations:^{

                             self.rightCalloutAccessoryView.alpha = 0;
                             self.rightCalloutAccessoryView.frame = CGRectMake(0
                                                                               , self.rightCalloutAccessoryView.frame.origin.y
                                                                               , self.rightCalloutAccessoryView.frame.size.width
                                                                               , self.rightCalloutAccessoryView.frame.size.height);


                             self.calloutView.frame = CGRectMake(self.calloutView.frame.origin.x
                                                                 , self.calloutView.frame.origin.y
                                                                 , self.calloutView.frame.size.width-150
                                                                 , self.calloutView.frame.size.height);




                         } completion:^(BOOL finished){

                             self.image = [UIImage imageNamed:@"map_pin.png"];
                             [self.calloutView  removeFromSuperview];
                             [self.rightCalloutAccessoryView removeFromSuperview];

                         }];
    }
}

@end
Was it helpful?

Solution 2

I fix the first one:

    TAPPMapAnnotation *theAnnotation = (TAPPMapAnnotation *)self.annotation;
    self.title           = [[UILabel alloc]init];
    self.title.font      = [UIFont systemFontOfSize:12.0];
    self.title.textColor = [UIColor whiteColor];
    self.title.backgroundColor = [UIColor clearColor];

    self.title.text      = theAnnotation.title;
    [...]
    [self.theView addSubview:self.title];

OTHER TIPS

Your annotation class needs to have a subtitle attribute, yours has subTitle.

If calloutAccessoryControlTapped is not being called it is usually a sign your MKMapview's delegate has not been set. However you're only setting the accessory button when it gets selected. Do you have a good reason for that? Since the callout window won't be visible until it is selected, I would advise you to set the accessory button in viewForAnnotation and let it appear when the callout window does.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top