Swift事件传递和响应过程
当view被点击,事件传递过程为:
1、系统检测到手指触(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列
2、UIApplication将处于任务队列最前端的事件向下分发,即UIWindow
3、UIWindow将事件向下分发,即UIView
4、UIView首先看自己是否能处理事件,触摸点是否在自己身上;能处理且触摸点在自己身上,就继续寻找子视图
5、遍历子控件,重复以上两不
6、如果没有找到,即自己最适合处理事件;若自己不能处理,则不做任何处理
UIView不接受事件处理的情况:
1、alpha < 0.01
2、userInteractionEnabled = NO
3、hidden = True
4、超出父控件区域
如何确定最适合处理事件的控件?
1、自己能响应事件
2、触摸点在自己身上
3、从后往前遍历子控件,重复上两步
4、如果没有符合条件的,那么自己就是最适合处理的
当事件传递时,会调用hitTest方法返回最合适响应的view
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
//1、如果控件不允许与用户交互,那么返回nil
if !isUserInteractionEnabled || alpha <= 0.01 || isHidden{
print("无法交互")
return nil
}
//2、如果点击的点不在当前控件中,返回nil
if !self.point(inside: point, with: event) {
return nil;
}
//3、从后往前遍历子控件
for i in (0..<subviews.count).reversed() {
print("i:",i)
let childv: UIView = subviews[i]
//当前触摸点的坐标转为相对于子控件触摸点的坐标
let childp: CGPoint = convert(point, to: childv)
//判断是否找到了更合适的子控件
let fitv = childv.hitTest(childp, with: event)
if (fitv != nil) {
return fitv
}
}
//没找到,则返回自己
return self
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkhhgi
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13