iOS 拖動手勢(UIPanGestureRecognizer)


https://www.jianshu.com/p/e318943549c7

 

https://www.cnblogs.com/whyandinside/archive/2013/10/26/3388908.html

 

在控件事件中,簡單解釋下下面幾個事件。
說明:由於是在“iOS 模擬器”中測試的,所以不能用手指,只能用鼠標。
1)UIControlEventTouchDown
指鼠標左鍵按下(注:只是“按下”)的動作


2)UIControlEventTouchDownRepeat
指鼠標左鍵連續多次重復按下(注:只是“按下”)的動作,比如,鼠標連續雙擊、三擊、……、多次連擊。
說明:多次重復按下時,事件序列是這樣的:
UIControlEventTouchDown -> (UIControlEventTouchUpInside) -> UIControlEventTouchDown -> UIControlEventTouchDownRepeat -> (UIControlEventTouchUpInside) -> UIControlEventTouchDown -> UIControlEventTouchDownRepeat -> (UIControlEventTouchUpInside) ->...
除了第一次按下外,后面每次摁下都是一個UIControlEventTouchDown事件,然后緊跟一個UIControlEventTouchDownRepeat事件。


3)UIControlEventTouchDragInside
指按下鼠標,然后在控件邊界范圍內拖動。


4)UIControlEventTouchDragOutside
與UIControlEventTouchDragInside不同的是,拖動時,鼠標位於控件邊界范圍之外。但首先得有個UIControlEventTouchDown事件,然后接一個UIControlEventTouchDragInside事件,再接一個UIControlEventTouchDragExit事件,這時,鼠標已經位於控件外了,繼續拖動就是UIControlEventTouchDragOutside事件了。
具體操作是:在控件里面按下鼠標,然后拖動到控件之外。


5)UIControlEventTouchDragEnter
指拖動動作中,從控件邊界外到內時產生的事件。


6)UIControlEventTouchDragExit
指拖動動作中,從控件邊界內到外時產生的事件。


7)UIControlEventTouchUpInside
指鼠標在控件范圍內抬起,前提先得按下,即UIControlEventTouchDown或UIControlEventTouchDownRepeat事件。


8)UIControlEventTouchUpOutside
指鼠標在控件邊界范圍外抬起,前提先得按下,然后拖動到控件外,即 UIControlEventTouchDown -> UIControlEventTouchDragInside(n 個) -> UIControlEventTouchDragExit -> UIControlEventTouchDragOutside(n 個) 時間序列,再然后就是抬起鼠標,產生UIControlEventTouchUpOutside事件。

 

前言

在iOS中手勢是經常用到的交互方式,最近工作中為了實現一個右滑接單的效果,對此進行了研究。其基本原理很簡單,給某個view添加手勢,當手勢觸發時,就會通知到相應的方法中。

狀態

手勢有state屬性,在觸發手勢時,會有不同的狀態

UIGestureRecognizerStateBegan  // 手勢開始 UIGestureRecognizerStateChanged // 手勢變化 UIGestureRecognizerStateEnded // 手勢結束 

開發者可以根據其狀態,做出對應的操作。

具體操作以及封裝思路

當前需求分析

滑動(其實就是改變view的frame),而且如果滑動距離不超過view的一半時,恢復為原狀,超過一半則滑動到最大,當滑到最大或者最小時不能再接着滑動。

封裝思路

既然決定封裝,那么就得通過當前需求,擴大功能,左右可以,那么上下是一樣的道理。
所以就需要枚舉值給外界用戶設置是水平還是豎直,甚至是既可以水平又可以豎直。
*注:枚舉設置的一個技巧:按位與,這樣可以實現方向的任意混合組合(參考自蘋果圓角設置的api)
具體怎么位移就不在此處敘述了。

手勢沖突的處理
/* 解決手勢沖突問題 * 1、當設置水平拖動時,手勢豎直拖動距離大於手勢水平拖動距離時,此手勢不響應 2、當拖動到最小值時,再往左拖動,不響應 3、當拖動到最大值時,再往右拖動,不響應 4、豎直邏輯同水平 */ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { UIView *view = gestureRecognizer.view; if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { CGPoint offset = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:view]; if (self.panDerection == JYCPanDerectionHorizontal && (fabs(offset.y) >= fabs(offset.x))) { return NO; } if (self.panDerection == JYCPanDerectionHorizontal && ((view.frame.origin.x == self.minX && offset.x < 0) || (view.frame.origin.x == self.maxX && offset.x > 0)) ) { return NO; } if (self.panDerection == JYCPanDerectionVertical && (fabs(offset.x) >= fabs(offset.y))) { return NO; } if (self.panDerection == JYCPanDerectionVertical && ((view.frame.origin.y == self.minY && offset.y < 0) || (view.frame.origin.y == self.maxY && offset.y > 0)) ) { return NO; } return YES; } return YES; } 
結束語

最后,附上自己的demo地址,歡迎大家學習
https://github.com/JiaYuanchao/JYCPanView



作者:雪中夜歸人
鏈接:https://www.jianshu.com/p/e318943549c7
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM