san
san

Reputation: 295

How to add a uibutton to custom annotation view

I have created a custom annotation view. In the setSelected method i have implemented a view as i need, now i want add a button to that view. But the button not detecting the click event, it absorbed by the mapview. what should i do for adding button like rightcalloutaccessory. Thanks in advance.

Upvotes: 2

Views: 1980

Answers (1)

san
san

Reputation: 295

I solved this problem by changing control event for the UIButton as

[button addTarget:self action:@selector(clickEvent) forControlEvents:UIControlEventTouchDown]

Below is the part of my code to create custom annotations.

    - (CustomAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[CustomAnnotation class]])
        {
             CustomAnnotationView *newAnnotationView = nil;
    // determine the type of annotation, and produce the correct type of annotation view for it.

             newAnnotationView = [[[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil delegate: targetController] autorelease];
             [newAnnotationView setEnabled:YES];
             [newAnnotationView setCanShowCallout:NO];
             return newAnnotationView;
       }
    }





    @interface CustomAnnotationView : MKAnnotationView 
    {
    }
    @end


    @implementation CustomAnnotationView

    - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier delegate:(id)targetController
    {
            self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
            /* Set initial width as you want. ex: 50X50*/
            self.frame = CGRectMake(0, 0, Initial_width, Initial_height); 
             self.backgroundColor = [UIColor redColor];
             return self;
    }

    /* When you tap on an annotation this method is fired*/ 
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
        if(selected){
            /* When you select annotation, instead of showing default callout you can increase the width &height of annotation and add your custom view here*/ 
                self.frame = CGRectMake(0, 0, max_width, max_height);
                UIView *view = [[UIView alloc]initWithFrame:CGRectMake(6, 0, max_width-10, max_height)];
                view.backgroundColor = [UIColor blackColor];

                UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];       
                    UIImage *img = [UIImage imageNamed:@"image.png"];
                but = CGRectMake(x , y, img.size.width + 20,  img.size.height + 15);
                [but setImage:img forState:UIControlStateNormal];
                [but addTarget:targetController action:@selector(methodName) forControlEvents:UIControlEventTouchDown];
                [view addSubview:but];

                [self addSubview:view];
        }
        else {
                /* When you tap outside of annotation, set the initial frame for the annotation. and remove the custom view from annotation*/
                self.frame = CGRectMake(0, 0, Initial_width, Initial_height);
                [view removeFromSuperview];

            }
    }

Upvotes: 3

Related Questions