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

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