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,之后就可以愉快地判断了。

所以,最后的解决方案是这样的,直接上代码:

如此,只要取到了当前触摸点,我们就可以做任何我们想做的范围判断了。

这也是我在开发中遇到的一个小问题,这样愉快地解决了。分享出来希望能帮助到大家。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 58,700评论 51 604
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 11,295评论 4 26
  • 在开发过程中,大家或多或少的都会碰到令人头疼的手势冲突问题,正好前两天碰到一个类似的bug,于是借着这个机会了解了...
    闫仕伟阅读 10,845评论 2 23
  • 1,点击事件和touch事件的关系 自定义UIButton并在其中重写以下方法: 添加UIButton并监听UIC...
    喵子G阅读 11,857评论 3 15
  • 努力 并不代表你就坚信 一定会有一个好的结果! 坚持 只是不想留给自己更多的遗憾 和悔恨! 明知道 路的尽头 也不...
    睡醒的猩猩阅读 2,435评论 0 2