Swift之手勢操作

weixin_33716557發表於2016-07-13
手勢識別在 iOS 中非常重要,他極大地提高了移動裝置的使用便捷性。iOS 系統在 3.2 以後,提供了一些常用的手勢(UIGestureRecognizer 的子類),今天給大家分享一下在swift中這些手勢的用法。 (≧▽≦)/
使用手勢很簡單,分為三步:
  • 建立手勢識別器物件例項。建立時,指定一個回撥方法,當手勢開始,改變、或結束時,執行回撥方法。
  • 設定手勢識別器物件例項的相關屬性(可選部分)
  • 新增到需要識別的 View 中。每個手勢只對應一個 View,當螢幕觸控在 View 的邊界內時,如果手勢和預定的一樣,那就會執行回撥方法。

一、UISwipeGestureRecognizer-滑動手勢

  let swip = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeGesture(_:)))
  //設定滑動方向
  //如果UISwipeGestureRecognizer在不指定方向的時候,預設向右滑動才會觸發事件。如果要指定方向,需要設定direction屬性
  swip.direction = UISwipeGestureRecognizerDirection.Left
  self.view.addGestureRecognizer(swip)

那麼有朋友可能會問,如果想要在各個方向都能滑動要怎辦呢,其實只要多定義幾個UISwipeGestureRecognizer就可以了

  let swipeUp = UISwipeGestureRecognizer(target:self, action:#selector(swipeGesture(_:)))
  swipeUp.direction = UISwipeGestureRecognizerDirection.Up
  self.view.addGestureRecognizer(swipeUp)
    
  let swipeDown = UISwipeGestureRecognizer(target:self, action:#selector(swipeGesture(_:)))
  swipeDown.direction = UISwipeGestureRecognizerDirection.Down
  self.view.addGestureRecognizer(swipeDown)

滑動響應事件:

//滑動手勢
func swipeGesture(swip:UISwipeGestureRecognizer) {
    print("開始滑動")
    if swip.direction == UISwipeGestureRecognizerDirection.Up {
        print("向上滑動")
    }else if swip.direction == UISwipeGestureRecognizerDirection.Down {
        print("向下滑動")
    }
}

Tip: 有時候我們會發現滑動手勢不響應,那可能是因為你滑動的太短了哦

二、UITapGestureRecognizer-點選手勢

在這六種手勢識別中,只有一種手勢是離散型手勢,就是 UITapGestureRecognizer。離散型手勢的特點就是:一旦識別就無法取消,而且只會呼叫一次手勢操作事件(初始化手勢時指定的回撥方法)。

​換句話說其他五種手勢是連續型手勢,而連續型手勢的特點就是:會多次呼叫手勢操作事件,而且在連續手勢識別後可以取消手勢。

  let tapOne = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapOne))
  //通過numberOfTouchesRequired屬性設定觸控點數,比如設定2表示必須兩個手指觸控時才會觸發
  tapOne.numberOfTapsRequired = 1
  //通過numberOfTapsRequired屬性設定點選次數,單擊設定為1,雙擊設定為2
  tapOne.numberOfTouchesRequired = 1
  //雙擊
  let tapTwo = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapTwo))
  tapTwo.numberOfTapsRequired = 2
  tapTwo.numberOfTouchesRequired = 1
  //宣告點選事件需要雙擊事件檢測失敗後才會執行
  tapOne.requireGestureRecognizerToFail(tapTwo)

點選響應事件:

//單擊
func tapOne() {
    print("單擊")
}
//雙擊
func tapTwo() {
    print("雙擊")
}

三、UIPinchGestureRecognizer-捏合手勢

捏合即進行當前圖片檢視縮放

  let pinch = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.pinchDid(_:)))

//捏合手勢
func pinchDid(pinch:UIPinchGestureRecognizer) {
    print(pinch.scale)//列印捏合比例
    print(pinch.velocity)//列印捏合速度
}

四、UIRotationGestureRecognizer-旋轉手勢

旋轉即進行當前圖片檢視角度旋轉

  let rotation = UIRotationGestureRecognizer(target: self, action: #selector(ViewController.rotationDid(_:)))

//旋轉手勢
func rotationDid(rotation:UIRotationGestureRecognizer) {
    print(rotation.rotation*(180/(CGFloat(M_PI))))//列印旋轉的角度
}

五、UIPanGestureRecognizer-拖動手勢

拖動即進行當前圖片檢視位置移動

    var rect: UIView?
    override func viewDidLoad() {
      super.viewDidLoad()
      rect = UIView(frame: CGRectMake(0, 0, 100, 100))
    rect?.center = self.view.center
    rect?.backgroundColor = UIColor.cyanColor()
    self.view.addSubview(rect!)
    //拖動手勢
    let pan = UIPanGestureRecognizer(target: self, action: #selector(ViewController.panDid(_:)))
    pan.maximumNumberOfTouches = 1  //一個手指拖動
} 
    //拖動手勢
   func panDid(pan:UIPanGestureRecognizer) {
     let point = pan.locationInView(self.view)
     //設定矩形的位置
     rect?.center = point
}

六、UILongPressGestureRecognizer-長按手勢

  let longPress = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longPress(_:)))
  longPress.numberOfTapsRequired = 0 //預設為0
  longPress.numberOfTouchesRequired = 1  //預設為1

 //長按手勢
func longPress(longPress:UILongPressGestureRecognizer) {
    if longPress.state == .Began {
        print("長按響應開始")
    } else {
        print("長按響應結束")
    }   
}
當我們使用手勢的時候,我們可能會監聽螢幕的狀態,這個時候我們還會用到UITouch物件,重寫他的相關方法:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("開始觸控")
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("觸控移動")
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    print("取消觸控")
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("觸控結束")
}

好啦,手勢在swift中的使用就分享到這裡啦。( _ )/~~拜拜

相關文章