同一个view上添加两个相同的手势
2014-11-18 17:55
323 查看
因为使用第三方库,第三方库里已经实现添加了点击事件,然后没有相应的对外接口,没办法添加手势响应事件,需要另外再注册一个手势。但是很遗憾,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的点击事件了,因此需要这么处理下。
另外还有一种处理方法,没有细究,姑且也放在这里。UIView是UIResponder的子类,在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];
}
}
想到一个办法可以尝试解决这个问题。再添加一层透明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的点击事件了,因此需要这么处理下。
另外还有一种处理方法,没有细究,姑且也放在这里。UIView是UIResponder的子类,在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];
}
}
相关文章推荐
- 为ListView添加适配器,使list可以显示一个ImageView和两个textview
- ios tableview cell上面的view添加手势,两个手指同时点击cell上的view的冲突(手势冲突)
- ASP.NET MVC开发,编辑页面和添加页面基本相同,我们控制器 Add Edit是共用同一个View吗?
- 在imageView依次添加7个手势, 1.点击哪个按钮,往imageView上添加哪个手势.(保证视图上只有一个手势). 2.轻拍:点击视图切换美女图片.(imageView上首先展示的美女
- 添加侧滑手势,滑出一个view
- Eclipse布局文件添加两个TextView,为什么运行后置显示一个
- 两个UIView添加同一个手势只有最后一个有用
- 第十五篇、OC_同一个View实现两个手势响应
- SugarCRM 一个页面控制两个模块(editview.php)
- 建立一个控制台应用程序向应用程序添加一个学生类,至少包含学号和成绩两个成员
- 界面上有两个DataGridView,其中的一个的水平滚动条滚动时,另外一个的水平滚动条也能够滚动相同的的距离
- 查找一个数组中的两个相同的数
- 查询一个表中的两个字段值相同的数据
- UIPanGestureRecognizer类——为view添加手势
- ios UIImagePickerController 添加一个自定义的view。
- 在Android中ListView中添加两个点击事件,一个是OnItemClick,另一个是一个图片的OnClick事件
- 请勿在一个工程中写两个相同名称的cpp文件
- 两个表中多个字段相同,查询一个中有在另一个表中没有的数据
- WCF 同一个协定中不能存在两个名称相同的操作
- 如何为一个网页中的frameset里两个frame中间添加一个伸缩条