在 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
}
}