iphone - 如何从通过 MKAnnotationView 添加的按钮获取点击事件

标签 iphone ios objective-c uibutton mkmapview

任何人都知道是否有办法从添加到 MKAnnotationViewbutton 获取点击事件,此 button 仅用作标签在 map 上显示每个图钉的名称,现在当 pin 被点击,所以我需要在点击按钮(标签)时做同样的事情。

感谢您提供的任何建议。

MKAnnotationView按钮的代码:

UIButton * pinButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 140, 28)];
[pinButton.titleLabel setTextColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1]]; 
[pinButton setCenter:CGPointMake(pinAnnotationView.center.x + 70, pinAnnotationView.center.y + 10)]; 
[pinButton addTarget:self action:@selector(pinLabelClicked) forControlEvents:UIControlEventTouchUpInside]; 
[pinAnnotationView addSubView:pinButton]; 
[pinButton setUserInteractionEnabled:YES];

最佳答案

标准的 UI 方法是使用 callout View 并添加一个附件按钮,如 progrmr 所示。

但是,如果您必须将按钮直接添加到 MKAnnotationView,您的方法的问题是 MKPinAnnotationView 的默认框架(不能轻易地已更改)小于您要添加的按钮,因此大多数按钮不会响应触摸,即使您切换到使用 MKAnnotationView 并增加框架大小,MKMapView 将阻止按钮获得任何触摸。

您需要做的是将 UITapGestureRecognizer 添加到按钮(使用手势处理程序的操作方法而不是按钮上的 addTarget)并将按钮添加到普通的 MKAnnotationView 使用适当的帧大小而不是 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);
}


请注意,这将阻止触发 map View 的 didSelectAnnotationView 委托(delegate)方法。如果您需要触发该方法(作为按钮的手势处理程序的补充),则添加以下内容:

//in the view controller's interface:
@interface YourVC : UIViewController <UIGestureRecognizerDelegate>

//where the UITapGestureRecognizer is created:
tap.delegate = self;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
        shouldRecognizeSimultaneouslyWithGestureRecognizer
            :(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

关于iphone - 如何从通过 MKAnnotationView 添加的按钮获取点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941199/

相关文章:

ios - 可以从 iCloud 驱动器下载文件吗?

iphone - 如何跟踪 iPhone 应用程序在 App Store 上的营销工作?

iphone - xcode 5 什么是警告现在是错误 - 控件可能到达非无效函数的末尾

ios - 未知属性属性 'atomic'

ios - 互联网连接在 iOS 应用程序中每秒检查一次

Objective-C SHA2 哈希无法与非 ASCII 一起正常工作

ios - Polidea 的 iOS Class Guard 成功,但无法区分差异

ios - 使用 Xcode 6 绕过代码签名

iphone - 如何在 Iphone 应用程序中创建日历?

iphone - 无法创建持久存储协调器