在MapView Objective C中的自定义标注视图中添加UIbutton事件

时间:2015-10-15 10:40:21

标签: ios objective-c mkmapview

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

    MKAnnotationView *view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"loc"];

    return view;
}

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
    for (MKAnnotationView *annotationView in views) {
        annotationView.canShowCallout = NO;
    }
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

    MAKRCalloutView *calloutView = [[MAKRCalloutView alloc] initWithNibName:@"ViewM" bundle:nil];

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(10.0, 10.0, 50.0, 50.0)];
    [btn setBackgroundColor:[UIColor redColor]];
    [btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:calloutView.view];
    [view addSubview:btn];

}


-(void) buttonClicked:(id)sender{

    NSLog(@" %ld button click %@ ", (long)[sender tag]);

}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
    for (UIView *subview in view.subviews) {

        MAKRCalloutView *calloutView = [[MAKRCalloutView alloc] initWithNibName:@"ViewM" bundle:nil];
        if (![subview isKindOfClass:[calloutView.view class]]) {
            continue;
        }

        [subview removeFromSuperview];
    }
}

我无法调用get按钮单击事件。即使我也不能点击按钮。我想通过点击按钮去其他UIViewController

我也试过UITapGestureRecognizer。但它仅限于Pin区域。

1 个答案:

答案 0 :(得分:0)

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

然后

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

        }
}