超出父视图的视图点击响应
2016-07-06 10:58
507 查看
标题中的需求其实常常能遇到,如下图
屏幕快照 2016-04-08 下午1.07.00.png
当按钮超出Tab bar的view后,那么其实按钮超出的部分是无法被点击的。那么先来说说解决办法
1.我们重写蓝色view的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event的方法
比如以下这个图
屏幕快照 2016-04-08 下午1.38.09.png
当我去点击View-C的时候,hit-Testing实际上是这样检测的
1.首先,视图会先从View-A开始检查,发现触摸点在View-A,所以检查View-A的子视图View-B。
2.发现触摸点在View-B内,好棒!看看View-B内的子视图View-C。
3.发现触摸点在View-C内,但View-C没有子视图了,所以View-C是此次触摸事件的hit-TestView了。
那么UIView中其实提供了两个方法来确定hit-TestView
1.- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;
2.- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;//这个就是我们上面重写的方法
注意其实在每次递归去调用hitTest:(CGPoint)point withEvent:(UIEvent *)event之前,都会调用pointInside:withEvent:来确定该触摸点是否在该View内。
所以当我们重写pointInside:(CGPoint)point withEvent:(UIEvent *)event后,其实我们的点击后调用hitTest来递归的找hit-TestView的区域从这样:
屏幕快照 2016-04-08 下午2.19.55.png
变成了这样:
屏幕快照 2016-04-08 下午2.20.43.png
这样当我们愉快的点击上半凸起的区域时,hit-Testing便回去检查蓝色视图内的子视图,即黄色区域。从而来完成此次触摸事件。
Enjoy :)
hitTest
Hacking the responder chain
在此例子中button,scrollview同为topView的子视图,但scrollview覆盖在button之上,这样在在button上的触摸操作返回的hit-test view为scrollview,button无法响应,可以修改topView的hitTest:withEvent:方法如下:
文/Victor_ding(简书作者)
原文链接:http://www.jianshu.com/p/638dd6585630
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
屏幕快照 2016-04-08 下午1.07.00.png
当按钮超出Tab bar的view后,那么其实按钮超出的部分是无法被点击的。那么先来说说解决办法
1.我们重写蓝色view的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event的方法
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ //if内的条件应该为,当触摸点point超出蓝色部分,但在黄色部分时 if (.....){ return YES; } return NO; }
那么以上为什么能解决方法?
这和iOS的事件分发机制 hit-Testing有关,简单的说,hit-Testing的作用就是找出你每次触摸屏幕,点到的究竟是哪个view。比如以下这个图
屏幕快照 2016-04-08 下午1.38.09.png
当我去点击View-C的时候,hit-Testing实际上是这样检测的
1.首先,视图会先从View-A开始检查,发现触摸点在View-A,所以检查View-A的子视图View-B。
2.发现触摸点在View-B内,好棒!看看View-B内的子视图View-C。
3.发现触摸点在View-C内,但View-C没有子视图了,所以View-C是此次触摸事件的hit-TestView了。
那么UIView中其实提供了两个方法来确定hit-TestView
1.- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;
2.- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;//这个就是我们上面重写的方法
注意其实在每次递归去调用hitTest:(CGPoint)point withEvent:(UIEvent *)event之前,都会调用pointInside:withEvent:来确定该触摸点是否在该View内。
所以当我们重写pointInside:(CGPoint)point withEvent:(UIEvent *)event后,其实我们的点击后调用hitTest来递归的找hit-TestView的区域从这样:
屏幕快照 2016-04-08 下午2.19.55.png
变成了这样:
屏幕快照 2016-04-08 下午2.20.43.png
这样当我们愉快的点击上半凸起的区域时,hit-Testing便回去检查蓝色视图内的子视图,即黄色区域。从而来完成此次触摸事件。
Enjoy :)
hitTest
Hacking the responder chain
在此例子中button,scrollview同为topView的子视图,但scrollview覆盖在button之上,这样在在button上的触摸操作返回的hit-test view为scrollview,button无法响应,可以修改topView的hitTest:withEvent:方法如下:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *result = [super hitTest:point withEvent:event]; CGPoint buttonPoint = [underButton convertPoint:point fromView:self]; if ([underButton pointInside:buttonPoint withEvent:event]) { return underButton; } return result; }
文/Victor_ding(简书作者)
原文链接:http://www.jianshu.com/p/638dd6585630
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- iOS 事件处理~简介
- HDU 2604 - Queuing
- Queue 与 List
- EditText实现搜索框常见需求详解(配合软键盘的应用和模拟搜索List结果集)
- iOS UITableView(UIScrollView)滑动到底部的判断
- 【URAL 1917】Titan Ruins: Deadly Accuracy(DP)
- Warnings : Aggregation query used without partition key
- 【UOJ #209】【UER #6】票数统计
- HDU 5297 Y sequencew(容斥+收敛迭代)
- loadonce:true后trigger("reloadGrid")无效
- cdq分治 -- CF edu13 F Lena and Queries
- Xamarin提示Build-tools版本过老
- Xamarin提示Build-tools版本过老
- IOS代码笔记UIView的placeholder的效果
- VideoJS live RTMP stream, player and video size issue
- android.uid.system和sdcard
- ueditor搭建图片服务器
- 大话 IQueryable和IEnumberable and IList与Lis t区别
- Android开发-个推(getui)透传推送实战项目应用(一)个推注册与官方Demo
- Android开发-个推(getui)透传推送实战项目应用(一)个推注册与官方Demo