iOS中MapKit标记点无法响应事件

iOS在使用原生地图MapKit的时候 会遇到点击锚点/标记点(MKAnnotationView)的需求,但是会发现点击并没有实际方法/代理 可以响应点击事件,虽然官方文档中提供一个方法可以选中其标记点并让其置于最顶成,但是还是无法满足大部分自定义选中需求

 [_chinaMapView selectAnnotation:tempMarker.pointAnnotation animated:YES]; //选中标记点 让其置于最顶

MapKit并不像谷歌地图 点击标记点可以响应其代理

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker

因为iOS自带的MapKit框架没有其点击代理,首先解决思路是在viewForAnnotation代理中去做手势或者按钮 然后通过手势或者代理的Tag

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

但是发现在MKAnnotationView 上面添加的事件或者手势并不能响应 而是被MapView给响应了
解决方案:去自定义一个AnnotationView继承MKAnnotationView
代码如下:

#import "HomeChinaAnnotationView.h"

@implementation HomeChinaAnnotationView

//如果监听到点击事件,就用 bringSubviewToFront 方法把self放在接收机的最前面,来接收这个事件。
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView != nil)
    {
        [self.superview bringSubviewToFront:self];
    }
    return hitView;
}

//此方法配合 - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event; 方法使用,用于判断点击的point是否在自定一的callout view 的 bounds 之内。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect rect = self.bounds;
    BOOL isInside = CGRectContainsPoint(rect, point);
    if(!isInside)
    {
        for (UIView *view in self.subviews)
        {
            isInside = CGRectContainsPoint(view.frame, point);
            if(isInside)
                return isInside;
        }
    }
    return isInside;
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值