ios 超出父控件区域支持点击事件
来源:互联网 发布:mac如何剪切复制 编辑:程序博客网 时间:2024/06/05 16:38
标题中的需求其实常常能遇到,如下图
当按钮超出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。
比如以下这个图
当我去点击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的区域从这样:
变成了这样:
这样当我们愉快的点击上半凸起的区域时,hit-Testing便回去检查蓝色视图内的子视图,即黄色区域。从而来完成此次触摸事件。
Enjoy :)
2017年3月1日更新
针对gwk_ios提问,我首先表示感谢,我们有必要把这个问题拿出来,研究一下。
让我们先看个图:
恩,这图似乎有点大。不过没事。
gwk_iost提出了2个问题
如果- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 方法只要return yes 就能点击超出父view边界的子view上的button呢
这样做实际上会有一个问题,如上图,如果在View A中,先添加View B(包含了Button A),再添加Button B,那么再点击Button B时,Button B的方法会被正确触发。
但是,[如果在View A中,先添加Button B,再添加View B(包含了Button A)],这个时候,你会发现,点击Button B时,方法无法被正确触发了。因为你在点击View A内的任意位置时,系统会优先调用View B 的pointInSide: WithEvent:方法,这时候你返回YES,就截断了事件,包括点击Button B。
那么 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 内if判断该怎么写呢
其实point会返回的坐标是基于该View的坐标系(所以超出该View时,可能会出现负数),以iphone 7的屏幕大小为例子:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ if (CGRectContainsPoint(CGRectMake(0, 0, 87.5, 100),point)||CGRectContainsPoint(CGRectMake(87.5, -100, 200, 200), point)||CGRectContainsPoint(CGRectMake(287.5, 0, 87.5, 100),point)) { return YES; } return NO;}
Enjoy :)
- ios 超出父控件区域支持点击事件
- iOS 超出父视图不响应点击事件的解决方法
- 如何让超出父视图区域的子视图实现点击事件
- 自定义控件实现不规则区域点击事件
- iOS中超出父视图的按钮点击事件响应处理
- iOS 子视图超出父视图范围 无法响应点击事件解决方案
- iOS-实现超出父视图点击响应
- UINavigationBar点击区域超出、覆盖的问题
- iOS实现UIImageView透明区域点击事件穿透
- iOS实现UIImageView透明区域点击事件穿透
- iOS实现UIImageView透明区域点击事件穿透
- iOS实现UIImageView透明区域点击事件穿透
- iOS实现UIImageView透明区域点击事件穿透
- iOS 实现 UIImageView 透明区域点击事件穿透
- iOS实现UIImageView透明区域点击事件穿透
- 关于超出父视图的子视图点击事件
- iOS不规则控件的点击事件
- ios UIView 遮挡子控件点击事件
- Android小问题的修改
- canvas动画时钟
- PyObject_CallObject 不运行,返回NULL
- ubuntu常用操作
- 朱熹《劝学文》
- ios 超出父控件区域支持点击事件
- android u盘两种方式使用(广播和挂载)
- 1.springboot注解详解
- LeetCode题库——LongestSubstringWithoutRepeatingCharacters
- 成为一名推荐系统工程师永远都不晚
- SAP中创建分部机构凭证号码并且按年度编号
- 【电子老鼠闯迷宫!】_(°:з」∠)_真让人头秃!!!!!
- 基于SnapDragonBoard410c的远程防盗系统
- Android----仿京东购物车(二级列表,mvp请求数据)