iOS开发:MKNewAnnotationContainerView-截取MKMapView控件上的touch事件

有时候会碰到这样的业务需求,需要截取MKMapView上点击、拖动、缩放、旋转等事件,其实也比较简单,使用

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event

这个方法就能捕捉到以上的touch事件。


但是对于基于MKMapView高度自定义的控件,我们需要在确定获取touch事件的同时,同时需要知道获取touch事件的view是什么,也就是- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 方法返回的UIView控件,才能明确我们接下来需要做什么事情,我需要确定触摸是在MKMapView控件上的空白处,而不是MKMapView.subview,看下面的代码

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
    UITouch *touch = [touches anyObject];
    NSLog(@"touchesBegan touch.view:%@,touch.phase:%ld",touch.view,(long)touch.phase);
    
    [super touchesBegan:touches withEvent:event];
    
    
}

触摸MKMapView,获取touch事件,打印出来得到下面的信息

2017-03-09 10:10:20.430 ******[17268:1996514] Method : -[MapNavigationTestViewController touchesBegan:withEvent:] 

 Line: 370 

 Content : touchesBegan touch.view:<MKNewAnnotationContainerView: 0x21f7dc90; frame = (0 0; 320 480); autoresize = W+H; autoresizesSubviews = NO; layer = <CALayer: 0x2326ec00>>,touch.phase:0


很疑惑touch.view是MKNewAnnotationContainnerView而不是MKMapView,继续查找苹果的文档,最后发现没有这个 MKNewAnnotationContainnerView的定义,想必苹果对MKMapView是封装了许多层视图而且没有必要暴露这些给开发者,那就意味着判断touch.view的类型不能使用[touch.view isKindOfClass:[MKNewAnnotationContainnerView class]]这种方式了。

既然MKNewAnnotationContainnerView这个类名已经知道了,这时runtime.h中的object_getClassName()方法就能很好的解决这个问题了,看下面的代码:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

        UITouch *touch = [touches anyObject];
        NSLog(@"touchesBegan touch.view:%@,touch.phase:%ld",touch.view,(long)touch.phase);
        
        NSString *className1 = @"MKNewAnnotationContainerView";
        
        NSString *className = [NSString stringWithCString:object_getClassName(touch.view) encoding:NSUTF8StringEncoding];
        if ([className1 isEqualToString:className])
        {

            NSLog(@"to do");
            
        }
        [super touchesBegan:touches withEvent:event];
    
    
}

需要强调的是,这个自定义的MKMapView是在添加了MKAnnotationView的情况下测试的,其他情况读者可以根据上面的方法自行测试验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值