(本文代碼已升級至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