UIGestureRecognizer

在 iOS 中包括下列几种手势识别,方便我们自定义一些与用户交互的操作方式。

UIPinchGestureRecognizer

两个手势放大或缩小,Pinch 手势传递的是比例,不是坐标。
当手势开始的时候,比例是 1

var scale: CGFloat // not read-only (can set) 当两个手指扩大一倍的时候,scale 为2,靠拢到一半的时候 scale 变成 0.5 
var velocity: CGFloat { get } // scale factor per second
UIRotationGestureRecognizer

两个手指的手势,在一个圆周上转动。就像一个旋转的按钮。他会告诉你旋转了多少弧度retation

var retation: CGFloat // not read-only (can reset); in radians
var velocity: CGFloat { get } // radians per second
UISwipeGestureRecognizer

当我创建了一个 Swipe 手势的时候,我需要设置它的属性,例如,点击的次数,或者滑动的方向,

var direction: UISwipeGestureRecoginzerDirection // which swipes you want
var numberOfTouchesRequired: Int // finger count
UITapGestureRecognizer

当我创建一个 Tap 手势的时候,我需要设置 tap 的次数

var numberOfTapsRequired: Int // single tap, double tap, etc.
var numberOfTouchesRequired: Int // finger count

我们在为某个 View 添加手势响应的时候

创建手势

我们当然可以在 StoryBoard 中直接从对象库中拖转手势到视图控制器,并为其设定 IBOutlet.
同样可以采用在手势目标视图的观察器中设置。
例如:

@IBOutlet weak var panableView: UIView {
    didSet {
        let recognizer = UIPanGestureRecognizer(target: self, action: "pan:")
        panableView.addGesturerecognizer(recognizer)
    }
}

panableView 是一个自定义视图,在 StoryBoard 中创建,可以利用属性观察,在视图被从 StoryBoard 中创建的时候添加手势,这是一个完美的地方。

手势的状态 - State

抽象类UIGestureRecognizer有一个重要的属性叫做state, 拖转一个手势会产生很多状态,
.Possible 标识是否响应的状态。

.Began
.Changed
.Ended
.Failed
.Cancelled //来电话了

识别手势的状态可以使用switch语法

func pan(gesture: UIPanGestureRecognizer) {
    switch gestureL.state {
      case .Changed: fallthrough
      case .Ended:
            let translation = gesture.translationInView(panableView)
            // ipdate anythging that depends on the pan gesture using rtranslation.x and .y
            gesture.setTranslation(CGPointZero, inView: panableView)
      default: break
    }
}

Demo

为视图添加手势并处理的例子,来自斯坦福大学的第六课,笑脸可以响应两手指的放大和缩小。上下滑动调整嘴的弧度,用以表示开心或伤心。

//in faceView didSet (viewController)
faceView.addGestureRecognizer(UIPinchGesutreRecognizer(target: faceView, action:"scale:"))
faceView.addGestureRecognizer(UIPanGestureRecognizer(target:self, action: "changeHappiness:"))
  
private struct Costants {
    static let HappinessGestureScale: CGFloat = 4
}
func changeHappiness(gesture: UIPanGestureRecognizer) {
    switch gesture.state {
      case .Ended: fallthrough
      case .Changed: 
            let translation = gesture.translationInView(faceView)
             let happinessChange = -Int(translation.y / Costants.HappinessGestureScale)
             if happinessChange != 0 {
                happiness += happinessChange
                gesture.setTranslation(CGPointZero, inView:faceView)
             }
       default: break
     }
}
  
//in faceView file
func scale(gesture: UIPinchGestureRecognizer) {
     if gesture.state == .Changed {
         scale *= gesture.scale
        gesture.scale = 1
      }
}

你可能感兴趣的:(UIGestureRecognizer)