Ответ 1
Стандартный подход к пользовательскому интерфейсу состоит в том, чтобы использовать вид выноска и добавить кнопку аксессуара в качестве прогрммера.
Однако, если вы должны добавить кнопку непосредственно в MKAnnotationView
, проблемы с вашим подходом состоят в том, что кадр MKPinAnnotationView
по умолчанию (который не может быть легко изменен) меньше, чем кнопка, которую вы добавляете большая часть кнопки не будет реагировать на касания, и даже если вы переключитесь на использование MKAnnotationView
и увеличьте размер кадра, MKMapView
не позволит кнопке получить какие-либо штрихи.
Что вам нужно сделать, это добавить кнопку UITapGestureRecognizer
к кнопке (используйте метод действия gesture handler вместо addTarget на кнопке) и добавьте кнопку в обычный MKAnnotationView
с соответствующим размером кадра вместо of MKPinAnnotationView
.
Пример:
- (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(handlePinButtonTap:)];
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) handlePinButtonTap:(UITapGestureRecognizer *)gestureRecognizer
{
UIButton *btn = (UIButton *) gestureRecognizer.view;
MKAnnotationView *av = (MKAnnotationView *)[btn superview];
id<MKAnnotation> ann = av.annotation;
NSLog(@"handlePinButtonTap: ann.title=%@", ann.title);
}
Обратите внимание, что это предотвратит запуск метода отображения didSelectAnnotationView
делегата. Если вам нужен этот метод для запуска (в дополнение к методу обработчика жестов кнопки), добавьте следующее:
//in the view controller interface:
@interface YourVC : UIViewController <UIGestureRecognizerDelegate>
//where the UITapGestureRecognizer is created:
tap.delegate = self;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer
:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}