同一个view上添加两个相同的手势

    因为使用第三方库,第三方库里已经实现添加了点击事件,然后没有相应的对外接口,没办法添加手势响应事件,需要另外再注册一个手势。但是很遗憾,ios不支持一个view里同时注册两个相同的手势,只会响应后添加的那个手势。除非强制重写没有对外开放的那个接口,但这肯定不是解决问题的办法。

    想到一个办法可以尝试解决这个问题。再添加一层透明layer,然后在layer上注册手势,并添加响应时间来实现类似于一个view上添加两个相同的手势的功能。我没有添加一层蒙板,因为之前的 mapView 上添加手势,而mapView又是添加在self.view上的。我直接在self.view上注册手势。


@property (nonatomic, retain) UITapGestureRecognizer  *tapMapGestureRecognizer;


self.tapMapGestureRecognizer =        

                   [[UITapGestureRecognize alloc initWithTarget:sel action:@selector(tapMap:)];

self.tapMapGestureRecognizer.delegate = self;

[self.view addGestureRecognizer:self.tapMapGestureRecognizer];


手势响应的方法为:


-(void)tapMap:(UITapGestureRecognizer *)gestureRecognizer

{

   

}


然后实现手势的代理方法为:


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

    return YES;

}


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

{

    //如果点击的是annotationView,则不响应地图选点事件(返回选点界面有点慢,查看什么问题)

    if (gestureRecognizer == self.tapMapGestureRecognizer && [touch.view isKindOfClass:[CMPoiLabelBallonView class]])

    {

        return NO;

    }

    return YES;

}


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

    return YES;

}


    特别要注意的地方就是最后一个代理方法的实现,在模拟器上调试,总是不响应事件,找了很久的原因才发现原来是这个代理方法没有实现。因为这些代理方法都是optional可选的,不是强制性的,需要特别注意下。

    然后就是上面的第二个方法里的处理,在识别手势时,点击地图,会弹出一个气泡,然后下次再点击气泡,当然不能响应self.view的点击事件了,因此需要这么处理下。


    另外还有一种处理方法,没有细究,姑且也放在这里。UIViewUIResponder的子类,在UIResponder的类里有几个实例方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;


    这几个实例方法会自动捕获view上的任何手势,当然既然能捕获所有手势,很自然就需要费一番力气来分别处理这些手势了。可以参看下面的例子来操作。


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

    if (touches.count > 0) {

        UITouch *touch = [touches anyObject];

        CGPoint point = [touch locationInView:self];

    }

}



- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    if (touches.count > 0) {

        UITouch *touch = [touches anyObject];

        CGPoint point = [touch locationInView:self];

        CLLocationCoordinate2D coordinate = [self convertPoint:point toCoordinateFromView:self];

//                [self.tapDelegate mapView:self.mapView onMapClick:coordinate];

    }

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值