Swift - 各種手勢檢測大全(UIGestureRecognizer及其子類)

(本文代碼已升級至Swift5)
UIGestureRecognizer 有許多子類,用于監(jiān)聽一些常見的手勢事件,這些子類主要有:

1、UISwipeGestureRecognizer:滑動(快速移動)
//滑動(快速移動)
func swipeGestureRecognizer()
{
    let swipe = UISwipeGestureRecognizer(target:self, action:#selector(ViewController.swipe(_:)))
    swipe.direction = .up//監(jiān)聽方向
    self.view.addGestureRecognizer(swipe)
}

@objc func swipe(_ recognizer:UISwipeGestureRecognizer)
{
    print("swipe ok")
    let point=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 就可以了

//滑動(快速移動)
func swipeGestureRecognizer()
{
    let swipeUp = UISwipeGestureRecognizer(target:self, action:#selector(ViewController.swipe(_:)))
    swipeUp.direction = .up
    self.view.addGestureRecognizer(swipeUp)
     
    let swipeDown = UISwipeGestureRecognizer(target:self, action:#selector(ViewController.swipe(_:)))
    swipeDown.direction = .down
    self.view.addGestureRecognizer(swipeDown)
}

@objc func swipe(_ recognizer:UISwipeGestureRecognizer)
{
    if recognizer.direction == .up{
        print("向上滑動")
    }else if recognizer.direction == .down{
        print("向下滑動")
    }
     
    let point=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)全部邊緣滑動。

// 邊緣滑動
func screenEdgePanGestureRecognizer()
{
    let swipe = UIScreenEdgePanGestureRecognizer(target:self, action:#selector(screenEdgePanSwipe))
    swipe.edges = UIRectEdge.left //從左邊緣開始滑動
    self.view.addGestureRecognizer(swipe)
}

@objc func screenEdgePanSwipe(_ recognizer:UIScreenEdgePanGestureRecognizer){
    print("left edgeswipe ok")
    let point = 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:輕點手勢(點擊)
func tapGestureRecognizer()
{
    //單擊監(jiān)聽
    let tapSingle=UITapGestureRecognizer(target:self,action:#selector(tapSingleDid))
    tapSingle.numberOfTapsRequired = 1
    tapSingle.numberOfTouchesRequired = 1
    //雙擊監(jiān)聽
    let tapDouble=UITapGestureRecognizer(target:self,action:#selector(tapDoubleDid(_:)))
    tapDouble.numberOfTapsRequired = 2
    tapDouble.numberOfTouchesRequired = 1
    //聲明點擊事件需要雙擊事件檢測失敗后才會執(zhí)行
    tapSingle.require(toFail: tapDouble)
    self.view.addGestureRecognizer(tapSingle)
    self.view.addGestureRecognizer(tapDouble)
}

@objc func tapSingleDid(){
    print("單擊了")
}
 
@objc func tapDoubleDid(_ sender:UITapGestureRecognizer){
    if sender.view == self.view{
        print("雙擊了")
    }
}
``
#####4、UIPinchGestureRecognizer:捏合手勢(兩個手指進行放大縮?。?

// 捏合手勢(兩個手指進行放大縮小)
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))
func rotationGestureRecognizer()
{
    let rotation = UIRotationGestureRecognizer(target:self,
                                               action:#selector(rotationDid(_:)))
    self.view.addGestureRecognizer(rotation)
}

@objc func rotationDid(_ recognizer:UIRotationGestureRecognizer){
    //旋轉(zhuǎn)的弧度轉(zhuǎn)換為角度
    print(recognizer.rotation*(180/CGFloat.pi))
}
6、UIPanGestureRecognizer:拖動手勢
// 拖動手勢
func panGestureRecognizer()
{
    rect = UIView(frame:CGRect(x:0, y:0, width:100, height:100))
    rect.center = self.view.center
    rect.backgroundColor = UIColor.orange
    self.view.addSubview(rect)
     
    let pan = UIPanGestureRecognizer(target:self,action:#selector(panDid(_:)))
    pan.maximumNumberOfTouches = 1
    rect.addGestureRecognizer(pan)
}

@objc func panDid(_ recognizer:UISwipeGestureRecognizer){
    let point=recognizer.location(in: self.view)
    //設(shè)置矩形的位置
    rect.center=point
}

通過 recognizer.view 我們可以直接得到觸發(fā)事件的 view 對象,下面樣例創(chuàng)建兩個方塊,但它們使用同一個拖動響應(yīng)方法。(注意:由于一個 GestureRecognizer 只能對應(yīng)一個 view,所以每個 view 還是要分別使用各自的 GestureRecognizer)

// 拖動手勢
func panGestureRecognizer2()
{
    //定義兩個方塊
    let rect1 = UIView(frame:CGRect(x:0, y:0, width:100, height:100))
    rect1.center = self.view.center
    rect1.backgroundColor = UIColor.orange
    self.view.addSubview(rect1)
     
    let rect2 = UIView(frame:CGRect(x:0, y:0, width:100, height:100))
    //rect2.center = self.view.center
    rect2.backgroundColor = UIColor.yellow
    self.view.addSubview(rect2)
     
    //由于一個GestureRecognizer只能對應(yīng)一個view,這里定義兩個GestureRecognizer
    let pan1 = UIPanGestureRecognizer(target:self,action:#selector(panDid2(_:)))
    pan1.maximumNumberOfTouches = 1
    rect1.addGestureRecognizer(pan1)
     
    let pan2 = UIPanGestureRecognizer(target:self,action:#selector(panDid2(_:)))
    pan2.maximumNumberOfTouches = 1
    rect2.addGestureRecognizer(pan2)
}

//兩個方塊都使用同一拖拽響應(yīng)方法
@objc func panDid2(_ recognizer:UIPanGestureRecognizer){
    let point=recognizer.location(in: self.view)
    //設(shè)置矩形的位置
    recognizer.view?.center = point
}
7、UILongPressGestureRecognizer:長按
/// 長按
func longPressGestureRecognizer()
{
    //長按監(jiān)聽
    let longPress = UILongPressGestureRecognizer(target:self,
                                               action:#selector(longPressDid(_:)))
    self.view.addGestureRecognizer(longPress)
}

@objc func longPressDid(_ sender: UILongPressGestureRecognizer){
    if sender.state == .began {
        print("長按響應(yīng)開始")
    } else {
        print("長按響應(yīng)結(jié)束")
    }
}

原文出自:www.hangge.com

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

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

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