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

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

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

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

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

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

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

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

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

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

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

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

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

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

1
2
3
4
5
.Began
.Changed
.Ended
.Failed
.Cancelled //来电话了

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

1
2
3
4
5
6
7
8
9
10
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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//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
}
}