Swift - 各種手勢檢測大全(UIGestureRecognizer及其子類)
UIGestureRecognizer 有許多子類,用于監(jiān)聽一些常見的手勢事件,這些子類主要有:
1、UISwipeGestureRecognizer:滑動(快速移動)
//滑動(快速移動)funcswipeGestureRecognizer(){letswipe=UISwipeGestureRecognizer(target:self,action:#selector(ViewController.swipe(_:)))swipe.direction=.up//監(jiān)聽方向self.view.addGestureRecognizer(swipe)}@objcfuncswipe(_recognizer:UISwipeGestureRecognizer){print("swipe ok")letpoint=recognizer.location(in:self.view)//這個點是滑動的起點print(point.x)print(point.y)}
注意1:如果 UISwipeGestureRecognizer 在不指定方向的時候,默認(rèn)向右滑動才會觸發(fā)事件。如果要指定方向,需要設(shè)置 direction 屬性
swipe.direction=.up//監(jiān)聽方向
注意2:有網(wǎng)友問如果各個方向都要響應(yīng)怎么辦,只要多定義幾個 UISwipeGestureRecognizer 就可以了
//滑動(快速移動)funcswipeGestureRecognizer(){letswipeUp=UISwipeGestureRecognizer(target:self,action:#selector(ViewController.swipe(_:)))swipeUp.direction=.upself.view.addGestureRecognizer(swipeUp)letswipeDown=UISwipeGestureRecognizer(target:self,action:#selector(ViewController.swipe(_:)))swipeDown.direction=.downself.view.addGestureRecognizer(swipeDown)}@objcfuncswipe(_recognizer:UISwipeGestureRecognizer){ifrecognizer.direction==.up{print("向上滑動")}elseifrecognizer.direction==.down{print("向下滑動")}letpoint=recognizer.location(in:self.view)//這個點是滑動的起點print(point.x)print(point.y)}
2、UIScreenEdgePanGestureRecognizer:邊緣滑動
(1)這個是?UISwipeGestureRecognizer?的子類,與后者不同的時。UIScreenEdgePanGestureRecognizer?只觸發(fā)從邊緣開始的劃動操作,比如從左側(cè)邊緣開始向右滑動。
(2)UIScreenEdgePanGestureRecognizer?沒有?direction?屬性,增加了個?edges?屬性。表示要響應(yīng)哪個邊緣的劃動操作??梢允菑淖筮吘壪蛴一瑒?,或右邊緣向左、上邊緣向下、下邊緣向上、或響應(yīng)全部邊緣滑動。
// 邊緣滑動funcscreenEdgePanGestureRecognizer(){letswipe=UIScreenEdgePanGestureRecognizer(target:self,action:#selector(screenEdgePanSwipe))swipe.edges=UIRectEdge.left//從左邊緣開始滑動self.view.addGestureRecognizer(swipe)}@objcfuncscreenEdgePanSwipe(_recognizer:UIScreenEdgePanGestureRecognizer){print("left edgeswipe ok")letpoint=recognizer.location(in:self.view)//這個點是滑動的起點print(point.x)print(point.y)}
3、UITapGestureRecognizer:輕點手勢(點擊)
(1)可以通過 numberOfTouchesRequired 屬性設(shè)置觸摸點數(shù),比如設(shè)置 2 表示必須兩個手指觸摸時才會觸發(fā)
(2)通過 numberOfTapsRequired 屬性設(shè)置點擊次數(shù),單擊設(shè)置為 1,雙擊設(shè)置為 2
(3)如果一個控件既監(jiān)聽了單擊事件也監(jiān)聽了雙擊事件,默認(rèn)當(dāng)雙擊事件觸發(fā)的時候也同時會觸發(fā)單擊事件。如果想雙擊時不觸發(fā)單擊,需要通過 require(toFail:) 進行設(shè)置
// UITapGestureRecognizer:輕點手勢(點擊)functapGestureRecognizer(){//單擊監(jiān)聽lettapSingle=UITapGestureRecognizer(target:self,action:#selector(tapSingleDid))tapSingle.numberOfTapsRequired=1tapSingle.numberOfTouchesRequired=1//雙擊監(jiān)聽lettapDouble=UITapGestureRecognizer(target:self,action:#selector(tapDoubleDid(_:)))tapDouble.numberOfTapsRequired=2tapDouble.numberOfTouchesRequired=1//聲明點擊事件需要雙擊事件檢測失敗后才會執(zhí)行tapSingle.require(toFail:tapDouble)self.view.addGestureRecognizer(tapSingle)self.view.addGestureRecognizer(tapDouble)}@objcfunctapSingleDid(){print("單擊了")}@objcfunctapDoubleDid(_sender:UITapGestureRecognizer){ifsender.view==self.view{print("雙擊了")}}``#####4、UIPinchGestureRecognizer:捏合手勢(兩個手指進行放大縮小)
// 捏合手勢(兩個手指進行放大縮?。?/p>
func pinchGestureRecognizer()
{
//設(shè)置監(jiān)聽方法為pinchDid方法
let pinch = UIPinchGestureRecognizer(target:self,action:#selector(pinchDid(_:)))
self.view.addGestureRecognizer(pinch)
}
@objc func pinchDid(_ recognizer:UIPinchGestureRecognizer) {
//在監(jiān)聽方法中可以實時獲得捏合的比例
print(recognizer.scale)
//獲取兩個觸摸點的坐標(biāo)
print(recognizer.location(ofTouch: 0, in: self.view))
print(recognizer.location(ofTouch: 1, in: self.view))
}
``
注:recognizer.location使用這個的時候需要判斷ofTouch: 1是否存在,因為當(dāng)你手指捏合松開一個手指的瞬間這個是空的,會造成崩潰。
5、UIRotationGestureRecognizer:旋轉(zhuǎn)手勢(兩個手指進行旋轉(zhuǎn))
// 旋轉(zhuǎn)手勢(兩個手指進行旋轉(zhuǎn))funcrotationGestureRecognizer(){letrotation=UIRotationGestureRecognizer(target:self,action:#selector(rotationDid(_:)))self.view.addGestureRecognizer(rotation)}@objcfuncrotationDid(_recognizer:UIRotationGestureRecognizer){//旋轉(zhuǎn)的弧度轉(zhuǎn)換為角度print(recognizer.rotation*(180/CGFloat.pi))}
6、UIPanGestureRecognizer:拖動手勢
// 拖動手勢funcpanGestureRecognizer(){rect=UIView(frame:CGRect(x:0,y:0,width:100,height:100))rect.center=self.view.center? ? rect.backgroundColor=UIColor.orangeself.view.addSubview(rect)letpan=UIPanGestureRecognizer(target:self,action:#selector(panDid(_:)))pan.maximumNumberOfTouches=1rect.addGestureRecognizer(pan)}@objcfuncpanDid(_recognizer:UISwipeGestureRecognizer){letpoint=recognizer.location(in:self.view)//設(shè)置矩形的位置rect.center=point}
通過 recognizer.view 我們可以直接得到觸發(fā)事件的 view 對象,下面樣例創(chuàng)建兩個方塊,但它們使用同一個拖動響應(yīng)方法。(注意:由于一個 GestureRecognizer 只能對應(yīng)一個 view,所以每個 view 還是要分別使用各自的 GestureRecognizer)
// 拖動手勢funcpanGestureRecognizer2(){//定義兩個方塊letrect1=UIView(frame:CGRect(x:0,y:0,width:100,height:100))rect1.center=self.view.center? ? rect1.backgroundColor=UIColor.orangeself.view.addSubview(rect1)letrect2=UIView(frame:CGRect(x:0,y:0,width:100,height:100))//rect2.center = self.view.centerrect2.backgroundColor=UIColor.yellowself.view.addSubview(rect2)//由于一個GestureRecognizer只能對應(yīng)一個view,這里定義兩個GestureRecognizerletpan1=UIPanGestureRecognizer(target:self,action:#selector(panDid2(_:)))pan1.maximumNumberOfTouches=1rect1.addGestureRecognizer(pan1)letpan2=UIPanGestureRecognizer(target:self,action:#selector(panDid2(_:)))pan2.maximumNumberOfTouches=1rect2.addGestureRecognizer(pan2)}//兩個方塊都使用同一拖拽響應(yīng)方法@objcfuncpanDid2(_recognizer:UIPanGestureRecognizer){letpoint=recognizer.location(in:self.view)//設(shè)置矩形的位置recognizer.view?.center=point}
7、UILongPressGestureRecognizer:長按
/// 長按funclongPressGestureRecognizer(){//長按監(jiān)聽letlongPress=UILongPressGestureRecognizer(target:self,action:#selector(longPressDid(_:)))self.view.addGestureRecognizer(longPress)}@objcfunclongPressDid(_sender:UILongPressGestureRecognizer){ifsender.state==.began{print("長按響應(yīng)開始")}else{print("長按響應(yīng)結(jié)束")}}