iOS--子视图如何穿透上层视图响应事件

摘要:
IV代码示例//在父视图中实现该方法-hitTest:pointwithEvent:event{//1。这是当前单击的视图。如果找不到适合响应操作的视图,将直接返回UIView*视图=[superitTest:point withEvent:event];//2。将父视图坐标转换为我要响应事件CGPointbuttonPoint=[selfconvertPoint:pointtoView:self.button]的视图坐标;//3.判断坐标是否在视图内。如果是,如果{returnself.button;}返回视图returnview;}5、 注1.设置隐藏=是;您仍然可以通过此方法响应事件。

一、使用方法:
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;

二.背景知识
iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,Application会从事件队列中取出触摸事件并传递给key window(当前接收用户事件的窗口)处理,window对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,称之为hit-test view。
window对象会在首先在view hierarchy的顶级view上调用hitTest:withEvent:,此方法会在视图层级结构中的每个视图上调用pointInside:withEvent:,如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是hit-test view。
三、处理流程
1.首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;
2.若返回NO,则hitTest:withEvent:返回nil;
3.若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从
top到bottom,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;
4.若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;
5.如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。
四、代码示例
// 在父视图中实现方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// 1.这是当前点击的视图,如果没有找到合适的响应操作的视图,则直接返回这个
UIView *view = [super hitTest:point withEvent:event];

// 2.将父视图坐标转成我想要响应事件的视图的坐标
CGPoint buttonPoint = [self convertPoint:point toView:self.button];

// 3.判断该坐标是否在视图内部,如果是,则返回该视图
if ([self.button pointInside:buttonPoint withEvent:event]) {
return self.button;
}
return view;
}
五、注意事项
1.设置hidden = YES;仍然是可以通过该方法响应事件。
2.设置alpha = 0.001;也是可以通过该方法响应事件。
3.子视图的 origin 即使超出父视图的范围也是可以响应事件。
4.设置userInteractionEnabled = NO;则不可以响应事件了。

by:lm

免责声明:文章转载自《iOS--子视图如何穿透上层视图响应事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇H3C VLAN 配置DevExpress Grid使用checkBox选中的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Windows 服务的安装(1)

如果读取器在安装后未能启动服务,则表明服务程序有问题。请修改服务程序。请注意,测试程序与服务在服务中打开的端口一致。此外,请使用installutil命令。exe服务文件的物理路径为/u,即在安装命令之后添加/u。在下一篇文章中,我将介绍如何通过C#程序安装窗口服务。请注意...

网页分页数据的三种抓取方式

目前,只有两种方法可以捕获其他网站的数据:我一开始尝试用第三方工具捕获所需的数据。现在我将介绍以三种形式捕获分页数据的方法。此方法通过循环生成数据分页的URL地址,例如:}上面的代码可以返回相应页面的html内容字符串,其分页控件通过post模式将分页信息提交给后台代码。当您将鼠标移到每个页码上时,状态栏将显示javascript:...

C#探秘系列(十)WPF:打开文件选择器选择文件并保存

//此为点击按钮的监听事件,点击按钮弹出文件选择器privatevoidimageButton_Click(objectsender,RoutedEventArgse){vardialog=newOpenFileDialog();dialog.Filter=".jpg|*.jpg|.png|*.png|.jpeg|*.jpeg";if(dialog.Show...

ABB机器人功能程序(FUNC)

功能程序的应用范围非常广泛。熟练的人员可以根据不同的需求创建相应的功能程序。函数程序的固定格式是FUNC,返回结束。在ABB的学习中,许多学生对功能程序几乎一无所知,即使他们真的在使用它。在学习ABB的过程中,我遇到了几个用例,所以我总结了它们以加深我的理解。...

RPi 树莓派 DSI 接口研究 MIPI raspberry pi

我已经玩树莓派很久了。我发现尚未使用DSI显示界面。经过一些研究,我发现它很有趣。我稍后会记录相关信息。(更新1:目前,整个网络上有很多方案来研究hdmi和mipi之间的相互转换方案:a.)mipi屏幕+hdmi界面:大多数都是因为有很多mipi屏幕和漂亮的参数而被研究的。详细信息:谷歌,得益于包括智汇在内的各种大神的研发,如Pocket LCD方案。最困难...

MySQL学习笔记:字符串前后补全0

遇到一个要求:如果位数小于6,则需要使用函数LPAD()和RPAD()自动完成6位。LPAD使用字符串padstr填充并完成左侧的str,直到其长度达到len个字符,并返回str。...