iOS 關(guān)于UIButton的TouchDragInside(內(nèi)部拖動(dòng))事件的覆蓋范圍/距離

? ? ? ? 標(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è)小問題,這樣愉快地解決了。分享出來希望能幫助到大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 59,435評(píng)論 51 604
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,237評(píng)論 4 26
  • 在開發(fā)過程中,大家或多或少的都會(huì)碰到令人頭疼的手勢(shì)沖突問題,正好前兩天碰到一個(gè)類似的bug,于是借著這個(gè)機(jī)會(huì)了解了...
    閆仕偉閱讀 5,663評(píng)論 2 23
  • 1,點(diǎn)擊事件和touch事件的關(guān)系 自定義UIButton并在其中重寫以下方法: 添加UIButton并監(jiān)聽UIC...
    喵子G閱讀 7,158評(píng)論 3 15
  • 努力 并不代表你就堅(jiān)信 一定會(huì)有一個(gè)好的結(jié)果! 堅(jiān)持 只是不想留給自己更多的遺憾 和悔恨! 明知道 路的盡頭 也不...
    睡醒的猩猩閱讀 342評(píng)論 0 2

友情鏈接更多精彩內(nèi)容