iOS 移动view的点击事件

iOS 移动view的点击事件,第1张

1.给移动 view 添加 Layer 动画

2. view 的父类添加点击事件

3.点击事件判断处理

参考一:ios捕捉移动view的点击事件

参考二:iOS 为移动中的UIView(UIButton )添加点击事件

当前View里面有两个View,绿色的bigView和红色的smallView,smallView在bigView里面。现在让bigView执行一段移动动画,然后给bigView添加点击事件,发现点击事件无效。

因为 iOS动画中的View点击事件无效

原因是iOS里几乎所有的View动画是都基于layer实现的,frame在动画开始会直接变成终点状态。动画过程中bigView的frame不会变化,也不能接收点击事件。添加点击事件可以在bigView的父view也就是当前view中重写touchesBegan() 方法,判断点击位置在哪个view里面。

添加完touchesBegan(),会发现点击bigView动画这个方法并不会触发,原因是动画中的layer会屏蔽触摸事件。这时有两种方法(效果相同):

这样点击事件就会传递给当前view

接下来判断点击位置在哪个View里。

用 touch.location(in: self) 获取触摸点在当前view中的位置;用bigView.layer.presentation()?.frame可以获取动画中的layer的frame。

1、Touch事件是由硬件捕获到触摸后由系统传递给应用的ViewRoot,再由ViewRoot往下一层一层传递.

2、处理过程都是自上而下的分发,可以看成是由布局的“包含”关系,自顶向下的方式

3、事件存在消耗,事件的处理方法都会返回一个boolean值,如果该值为true,则本次事件下发将会被消费掉,而不会继续往下一层传递.

4、Touch事件从ACTION_DOWN开始,也就是按下的这个action开始算起,到ACTION_UP抬起时结束;但是如果在ACTION_DOWN的时候,没有接受事件,那么后续的其他动作也将不会被接受

5、dispatchTouchEvent方法,是用来分发上层传递过来的事件的,它在View和ViewGroup中都有实现

6、onInterceptTouchEvent方法,是用来拦截事件传递的,它只在ViewGroup中有实现,在View中没有

7、view对象的TouchLitener中的onTouch方法总是会先于view自己的onTouchEvent(event)方法被执行,这是由View中的dispatchEvent方法决定。

8、Activity中的onTouchEvent只会在能响应的所有view都响应完事件,且都没有消费掉事件之后才会被调用。

9、如果一个ViewGroup被点击的地方,有多个子View/ViewGroup可以响应点击事件,那么它们响应的顺序是:后addView进来的子view/ViewGroup先响应事件或者是xml布局文件中后被添加的view先 响应触摸事件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11821605.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存