? ? ? ? 標題是這樣的《iOS 關于UIButton的TouchDragInside(內部拖動)/TouchDragExit(拖拽中由內部移到外面)事件的覆蓋范圍/距離》,我們來討論下UIButton的 “touch events們”事件,以及button的邊界問題和覆蓋范圍。
首先要明白一點,那就是在UIButton周圍會有70px的擴展范圍。
其次還要明白,我們點擊一個button的時候,“手指按下”會觸發(fā)touchDown事件,“手指抬起”分兩種,一種是內部抬起,對應TouchUpInside,另一種是外部抬起,對應TouchUpOutside。
當手指按下不松開,慢慢移動,對應事件為TouchDragxxx,其實有四種狀態(tài),分別是在內部拖拽TouchDragInside,在外部拖拽TouchDragOutside,拖拽移出(由內部而外)TouchDragExit,拖拽移進(由外向內部)TouchDragEnter。(參見“UIView的Touch事件UIControlEvents詳解”,http://blog.csdn.net/heng615975867/article/details/39321081)
那么有一個問題出現(xiàn)了,“內部”和“外部”如何區(qū)分,其邊界是什么?
下面就討論下這個邊界。開始已經(jīng)說過了,在UIButton周圍-從button的frame向四周擴展有一個70像素的響應范圍,當我們在button內部手指按下不抬起,接著慢慢拖動,會發(fā)現(xiàn)手指已經(jīng)離開button的bounds了,但是button還是選中狀態(tài),直到超過(邊界+70)的距離才會觸發(fā)touchDragExit事件,也就是“手指離開button區(qū)域”了。
那么我們在處理比如數(shù)字鍵盤這些精細化的控件的時候就顯得非常難堪,而此時我們并不需要這多余的70px。
那么怎么處理呢,或者說怎么判斷當前的手指觸摸點是不是已經(jīng)出來button的bounds范圍了呢?問題的關鍵是如何判斷。其實并不難,我們只要取到當前手指的觸摸點就可以了。第一反應是UIView的 “touchesMoved:withEvent: ” 事件。可是此時并不會響應這個事件,而是響應button的touchDrag事件。然后,我們平時給button添加target響應的時候一般會簡單傳一個參數(shù),那就是button本身。所以我們自定義的響應方法中沒辦法取到touchedPoint這個當前觸摸點。
那么換個思路,更深層次考慮一下,我們能不能模仿 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event ? ,把對button觸發(fā)的事件也傳遞到自定義方法種中呢?因為如果有了event,我們就能從event中取到touch,從而取到point,之后就可以愉快地判斷了。
所以,最后的解決方案是這樣的,直接上代碼:

如此,只要取到了當前觸摸點,我們就可以做任何我們想做的范圍判斷了。
這也是我在開發(fā)中遇到的一個小問題,這樣愉快地解決了。分享出來希望能幫助到大家。