UIGestureRecognizer在多层视图中的触发问题
2013-07-16 20:34
176 查看
在一个superview中,添加了一个subview。tap一下superview,将subview隐藏起来。
在视图superview添加一个UITapGestureRecognizer对象,在UITapGestureRecognizer对象的action中实现隐藏subview的逻辑代码。
UIView *superview = [[UIView alloc] initWithFrame:CGRectMake:(0, 0, 320, 480);
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake:(100, 100, 100, 100);
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(handleTap);
[superview addGestureRecognizer:recognizer];
[self.view addSubview:superview];
[superview addSubview:subview];
代码很简单,tap一下superview视图,果然就隐藏了subview。但是,我tap一下subview视图,它也隐藏了subview。
基于对hitTest:withEvent:调用过程的理解,我们知道hit是在多层view上传递的。
我想到在subview也加一个UITapGestureRecognizer,将这个tap操作截获,处理掉,这样就不会传到superview上,就不会调用superview上的UITapGestureRecognizer的动作handleTap。
这个方法虽然能用,但也太笨了,无缘无故做一个操作,还要维护一个方法。笨!!!
其实,UIGestureRecognizer是有delegate设置的,能对每一个UITapGestureRecognizer的对象进行对应处理。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
CGPoint touchPoint = [touch locationInView:self.view];
return !CGRectContainsPoint(subview.frame, touchPoint);
}
完全可以对每一个tap操作touchPoint进行判断,如果touchPoint 在subview上,完全可以返回False,让UIGestureRecognizer不做任何操作,不触发其action。该方法的默认返回值为True。
记住,recognizer的delegate的属性值要设置为self,才会调用这个方法。
recognizer.delegate = self;
在iOS中,很多类都有delegate设置,可以用来实现这类逻辑判断。iOS的架构设计得真的很好,真心赞一句!
在视图superview添加一个UITapGestureRecognizer对象,在UITapGestureRecognizer对象的action中实现隐藏subview的逻辑代码。
UIView *superview = [[UIView alloc] initWithFrame:CGRectMake:(0, 0, 320, 480);
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake:(100, 100, 100, 100);
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(handleTap);
[superview addGestureRecognizer:recognizer];
[self.view addSubview:superview];
[superview addSubview:subview];
代码很简单,tap一下superview视图,果然就隐藏了subview。但是,我tap一下subview视图,它也隐藏了subview。
基于对hitTest:withEvent:调用过程的理解,我们知道hit是在多层view上传递的。
我想到在subview也加一个UITapGestureRecognizer,将这个tap操作截获,处理掉,这样就不会传到superview上,就不会调用superview上的UITapGestureRecognizer的动作handleTap。
这个方法虽然能用,但也太笨了,无缘无故做一个操作,还要维护一个方法。笨!!!
其实,UIGestureRecognizer是有delegate设置的,能对每一个UITapGestureRecognizer的对象进行对应处理。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
CGPoint touchPoint = [touch locationInView:self.view];
return !CGRectContainsPoint(subview.frame, touchPoint);
}
完全可以对每一个tap操作touchPoint进行判断,如果touchPoint 在subview上,完全可以返回False,让UIGestureRecognizer不做任何操作,不触发其action。该方法的默认返回值为True。
记住,recognizer的delegate的属性值要设置为self,才会调用这个方法。
recognizer.delegate = self;
在iOS中,很多类都有delegate设置,可以用来实现这类逻辑判断。iOS的架构设计得真的很好,真心赞一句!
相关文章推荐
- UIGestureRecognizer在多层视图中的触发问题
- Oracle表结构修改触发视图无法正常使用问题
- Oracle表结构修改触发视图无法正常使用问题
- NavigationBar设置背景图片后,内容视图会下移的问题
- Java解决双击事件触发前总触发单击事件的问题
- Oracle优化一个视图发现的问题。
- Asp.net MVC 3 Razor 视图引擎 中使用@输出的内容都会被自动进行HTML编码 问题的解决办法
- shouldAutorotateToInterfaceOrientation 不触发或者不执行的问题 及旋转过程中各方法的作用
- 主实体和子实体配置级联删除,不能触发子实体的Plugin的问题
- 有关MFC单文档多视图的问题
- 关于自定义视图不响应点击的问题
- 导航栏影响滚动视图的内部布局问题
- Windows Phone 7 ApplicationBar 轴视图切换 出现黑条或白条问题
- Qt按ESC关闭模态对话框不触发closeEvent()问题解析
- WebBrowser 触发F5等快捷键的相关问题
- sqlserver -- 学习笔记(三)解决php连接sqlserver2005视图时显示“异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项”的问题
- 在布局中使用include引入其他layout时引发click事件不触发的问题
- 一个还原视图原来状态的问题(ADO.NET)
- 新创建对象直接触发fullGC问题
- Spring MVC视图问题