问题
I've a custom class of MKAnnotationView
in which I'm trying to add 8 button to the annotation in a circular fashion.I've added the buttons.Their postion in the view is perfectly fine but the action of the buttons doesn't get called.Why the action is not getting called and what is the solution.
-(void)setSelected:(BOOL)selected animated:(BOOL)animated`
{
[super setSelected:selected animated:animated];
if(selected)
{
UIView *circularView = [[UIView alloc]initWithFrame:CGRectMake(-55, -55, 110, 110)];
circularView.tag = 1000;
UIButton *btn1;
UIButton *btn2;
UIButton *btn3;
UIButton *btn4;
UIButton *btn5;
UIButton *btn6;
UIButton *btn7;
btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn1];
btn1.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(buttonTapped:)];
tap.numberOfTapsRequired = 1;
[btn1 addGestureRecognizer:tap];
btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn2];
btn3 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn3];
btn4 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn4];
btn5 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn5];
btn6 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn6];
btn7 = [UIButton buttonWithType:UIButtonTypeCustom];
[circularView addSubview:btn7];
[btn1 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
[btn2 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
[btn3 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
[btn4 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
[btn5 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
[btn6 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
[btn7 setBackgroundImage:[UIImage imageNamed:@"message-icon"] forState:UIControlStateNormal];
CGPoint point = CGPointMake(55, 55);
btn1.frame = CGRectMake(point.x - 15.00, point.y - 55.00, 30, 30);
btn2.frame = CGRectMake(point.x + 16.27, point.y - 39.94, 30, 30);
btn3.frame = CGRectMake(point.x + 24.00, point.y - 06.10, 30, 30);
btn4.frame = CGRectMake(point.x + 02.36, point.y + 21.04, 30, 30);
btn5.frame = CGRectMake(point.x - 32.36, point.y + 21.04, 30, 30);
btn6.frame = CGRectMake(point.x - 54.00, point.y - 06.10, 30, 30);
btn7.frame = CGRectMake(point.x - 46.27, point.y - 39.94, 30, 30);
[self addSubview:circularView];
}
else
{
[[self viewWithTag:1000] removeFromSuperview];
}
}
-(void)buttonTapped:(UITapGestureRecognizer*)sender
{
}
回答1:
Just try to add the UIButton
like bellow and call it's event with UITapGestureRecognizer
.. See the Example bellow...
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id<MKAnnotation>)annotation
{
MKAnnotationView *annView = (MKAnnotationView *)[mapView
dequeueReusableAnnotationViewWithIdentifier: @"pin"];
if (annView == nil)
{
annView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"pin"] autorelease];
annView.frame = CGRectMake(0, 0, 200, 50);
UIButton *pinButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
pinButton.frame = CGRectMake(0, 0, 140, 28);
pinButton.tag = 10;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(btnPinTap:)];
tap.numberOfTapsRequired = 1;
[pinButton addGestureRecognizer:tap];
[tap release];
[annView addSubview:pinButton];
}
annView.annotation = annotation;
UIButton *pb = (UIButton *)[annView viewWithTag:10];
[pb setTitle:annotation.title forState:UIControlStateNormal];
return annView;
}
- (void) btnPinTap:(UITapGestureRecognizer *)gestureRecognizer
{
UIButton *btn = (UIButton *) gestureRecognizer.view;
MKAnnotationView *av = (MKAnnotationView *)[btn superview];
id<MKAnnotation> ann = av.annotation;
NSLog(@"btnPinTap: ann.title=%@", ann.title);
}
Just add Delegate in .h
file ..
UIGestureRecognizerDelegate
and just put this bellow method in your .m
file...
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer
:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
i hope this helpful to you...
回答2:
I couldn't find any solution for this.So,I think this is not possible with this method.If still some one wants to implement this functionality then one has to use draw them on an UIiew whose user interaction is disabled.Add this UIView on the MKMapView. Use the method didSelectAnnotationView
with [mapView deselectAnnotation:view.annotation animated:YES];
if needed.
回答3:
It's because circularView is outside the annotation frame. Expanding self.frame to the size of circularView will make it work. But, depending on other things, pins etc, it might not look great.
来源:https://stackoverflow.com/questions/14121030/adding-uibutton-to-mkannotationview