在 iOS 中包括下列几种手势识别,方便我们自定义一些与用户交互的操作方式。
###1.UIPinchGestureRecognizer
两个手势放大或缩小,Pinch
手势传递的是比例,不是坐标。
当手势开始的时候,比例是 1
1 2
| var scale: CGFloat var velocity: CGFloat { get }
|
###2.UIRotationGestureRecognizer
两个手指的手势,在一个圆周上转动。就像一个旋转的按钮。他会告诉你旋转了多少弧度retation
1 2
| var retation: CGFloat var velocity: CGFloat { get }
|
###3.UISwipeGestureRecognizer
当我创建了一个 Swipe
手势的时候,我需要设置它的属性,例如,点击的次数,或者滑动的方向,
1 2
| var direction: UISwipeGestureRecoginzerDirection var numberOfTouchesRequired: Int
|
###4.UITapGestureRecognizer
当我创建一个 Tap 手势的时候,我需要设置 tap 的次数
1 2
| var numberOfTapsRequired: Int var numberOfTouchesRequired: Int
|
我们在为某个 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) 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
| 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 } } func scale(gesture: UIPinchGestureRecognizer) { if gesture.state == .Changed { scale *= gesture.scale gesture.scale = 1 } }
|