iOS 关于UIButton的TouchDragInside(内
标题是这样的《iOS 关于UIButton的TouchDragInside(内部拖动)/TouchDragExit(拖拽中由内部移到外面)事件的覆盖范围/距离》,我们来讨论下UIButton的 “touch events们”事件,以及button的边界问题和覆盖范围。
首先要明白一点,那就是在UIButton周围会有70px的扩展范围。
其次还要明白,我们点击一个button的时候,“手指按下”会触发touchDown事件,“手指抬起”分两种,一种是内部抬起,对应TouchUpInside,另一种是外部抬起,对应TouchUpOutside。
当手指按下不松开,慢慢移动,对应事件为TouchDragxxx,其实有四种状态,分别是在内部拖拽TouchDragInside,在外部拖拽TouchDragOutside,拖拽移出(由内部而外)TouchDragExit,拖拽移进(由外向内部)TouchDragEnter。(参见“UIView的Touch事件UIControlEvents详解”,http://blog.csdn.net/heng615975867/article/details/39321081)
那么有一个问题出现了,“内部”和“外部”如何区分,其边界是什么?
下面就讨论下这个边界。开始已经说过了,在UIButton周围-从button的frame向四周扩展有一个70像素的响应范围,当我们在button内部手指按下不抬起,接着慢慢拖动,会发现手指已经离开button的bounds了,但是button还是选中状态,直到超过(边界+70)的距离才会触发touchDragExit事件,也就是“手指离开button区域”了。
那么我们在处理比如数字键盘这些精细化的控件的时候就显得非常难堪,而此时我们并不需要这多余的70px。
那么怎么处理呢,或者说怎么判断当前的手指触摸点是不是已经出来button的bounds范围了呢?问题的关键是如何判断。其实并不难,我们只要取到当前手指的触摸点就可以了。第一反应是UIView的 “touchesMoved:withEvent: ” 事件。可是此时并不会响应这个事件,而是响应button的touchDrag事件。然后,我们平时给button添加target响应的时候一般会简单传一个参数,那就是button本身。所以我们自定义的响应方法中没办法取到touchedPoint这个当前触摸点。
那么换个思路,更深层次考虑一下,我们能不能模仿 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event ,把对button触发的事件也传递到自定义方法种中呢?因为如果有了event,我们就能从event中取到touch,从而取到point,之后就可以愉快地判断了。
所以,最后的解决方案是这样的,直接上代码:
![](https://img.haomeiwen.com/i2200657/4241cb0df6018a55.png)
如此,只要取到了当前触摸点,我们就可以做任何我们想做的范围判断了。
这也是我在开发中遇到的一个小问题,这样愉快地解决了。分享出来希望能帮助到大家。