一、UI事件的分类:
事件:
Events are objects sent to an app to inform it of user actions. In iOS, events can take many forms: Multi-Touch events, motion events, and events for controlling multimedia. This last type of event is known as a remote control event because it can originate from an external accessory.
1.Multitouch events:屏幕的触摸
2.Accelerometer events:对设备的直接操作比如摇晃
3.RemoteControl events:对设备的远程控制,比如耳机按键控制手机歌曲播放

以Touch为例:
UIViewController 继承自UIResponder
实现了下面四个事件响应:
func touchesBegan(touches: NSSet, withEvent event: UIEvent)
func touchesMoved(touches: NSSet, withEvent event: UIEvent)
func touchesEnded(touches: NSSet, withEvent event: UIEvent)
func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!)
我们也可以在自定义的UIView类中实现这四个事件:
import UIKit
class LyUIImageView: UIView {
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
NSLog("Touch began")
return
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
NSLog("Touch Moved")
return
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
NSLog("Touch Cancelled")
return
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
NSLog("Touch end")
return
}
}
二、代码添加手势识别步骤:
1.建立和设置手势识别器实例,设置target、action和制定一些属性;
var gester1 = UITapGestureRecognizer(target: self, action: "myImageViewClicked")
2.附加识别器到视图;
self.myImageView.addGestureRecognizer(gester1)
3.实现响应action。
func myImageViewClicked(){
NSLog("my taped")
}
注意事项:
无论是手动代码绑定的手势识别还是拖拽的,一定要记住勾选这两项:
UserInteraction Enabled:是否允许 用户交互操作‘
Multiple Touch:是否允许多点触控
手势识别器识别出是什么样的手势,然后决定发送相应的消息到其绑定的VIewController,ViewController相应事件。
三、具体的手势识别控件
1.UITapGestureRecongnizer点击
点击次数:numberOfTapsRequired
点数:numberOfTouchesRequired
2,UIPinchGestureRecongnizer缩放
放大缩小倍数;scale
注意:该手势识别绑定的View的大小,在使用模拟器时如果这两个点不全在View内,会不起作用。
3.UIRotationGestureReconginzer旋转
旋转角度:totation
响应方法:
@IBAction func myViewRotation(sender: UIRotationGestureRecognizer) {
self.myView.transform = CGAffineTransformMakeRotation(sender.rotation)
}
4.UISwipeGestureRecongnizer滑动
移动方向:direction-Right Left Up Down
点数:numberOfTouchesRequired
响应事件:
//direction选中的是哪个哪个就会响应
@IBAction func myLableSwipe(sender: UISwipeGestureRecognizer) {
if(sender.direction == UISwipeGestureRecognizerDirection.Right){
transX += 20
self.myLabel.transform = CGAffineTransformMakeTranslation(transX, 0)
}
if(sender.direction == UISwipeGestureRecognizerDirection.Left){
transX -= 20
self.myLabel.transform = CGAffineTransformMakeTranslation(transX, 0)
}
if(sender.direction == UISwipeGestureRecognizerDirection.Up){
transY -= 20
self.myLabel.transform = CGAffineTransformMakeTranslation(0, transY)
}
if(sender.direction == UISwipeGestureRecognizerDirection.Down){
transY += 20
self.myLabel.transform = CGAffineTransformMakeTranslation(0, transY)
}
}
小技巧:多点时平移,在模拟器上可以同时按住alt 和 sheft 移动鼠标
5.UIPanGestureRecongnizer平移
minimumNumberOfTouches:最少触控点
maxmumNumberOfTouches:最多触控点
响应事件:
@IBAction func myImageViewPan(sender: UIPanGestureRecognizer) {
var transX = sender.translationInView(myImageView).x
var transY = sender.translationInView(myImageView).y
myImageView.transform = CGAffineTransformMakeTranslation(transX, transY)
}
6.UILongPressGestureRecongnizer长按
属性:
minimumPressDrution:最小长按时间
tolerance:allowableMovement允许按住时移动点数
taps touches
响应方法:
@IBAction func myImageViewLongPressed(sender: UILongPressGestureRecognizer) {
UIAlertView(title: "您长按了", message: "想干什么", delegate: self, cancelButtonTitle: "取消").show()
}
四、Touch的事件阶段
事件处理方法:
在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息:
当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。
当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。
当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。
当触摸序列被诸如电话呼入这样的系统事件所取消时,发送touchesCancelled:withEvent:消息。
五、事件状态机-如何定义手势识别的交互

手势识别从一个状态转换到另一个在一个预先定义的方式。从每一个状态,他们可以将多个可能的下一状态
的基础上是否满足一定的条件。准确的状态机的变化取决于手势识别是离散的或连续的,如图1-3所示。在可能的状态开始所有的手势识别(uigesturerecognizerstatepossible)。他们分析的任何多点触控的序列,他们收到的,并在分析他们要么承认或不承认一个手势。无法识别的手势手势识别过渡到Failed状态(uigesturerecognizerstatefailed)。
当一个离散的手势识别器识别它的手势,手势识别转换可能认可(uigesturerecognizerstaterecognized)和识别是完整的。 连续的手势,手势识别转换可能开始(uigesturerecognizerstatebegan)时所做的姿势是第一个承认。然后,它转换从开始改变(uigesturerecognizerstatechanged),并继续从改变状态发生改变。当用户的手指从屏幕移除,手势识别转变为结束状态(UIGestureRecognizerStateEnded等)和识别是完整的。注意结束状态是一个别名为公认的状态。
六、触摸传递到试图的默认路径

// ViewController.swift
// CustomUIGestureRecognizerDemo10
//
// Created by 兰杨 on 15/4/4.
// Copyright (c) 2015年 ly. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet var myImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//实例化手势识别器
var customGesture = UICustomGestureRecognizer(target: self, action: "handleCustomGesture")
//绑定手势识别器和视图
self.myImageView.addGestureRecognizer(customGesture)
}
//实现响应方法
func handleCustomGesture(){
NSLog("对角手势正确")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
//
// UICustomGestureRecognizer.swift
// CustomUIGestureRecognizerDemo10
//
// Created by 兰杨 on 15/4/4.
// Copyright (c) 2015年 ly. All rights reserved.
//
import UIKit
import UIKit.UIGestureRecognizerSubclass
class UICustomGestureRecognizer: UIGestureRecognizer {
var leftTop = false
var rightDowen = false
var middle = false
override init(target: AnyObject, action: Selector) {
super.init(target: target, action: action)
}
override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
leftTop = false
rightDowen = false
middle = false
}
override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) {
var myTouch = touches.anyObject() as UITouch
var myLocation = myTouch.locationInView(self.view)
var _ViewWidth = self.view?.bounds.width
var _ViewHight = self.view?.bounds.height
if(myLocation.x <= 10 && myLocation.y <= 10){
leftTop = true
}else if(myLocation.x + 10 >= _ViewWidth && myLocation.y + 10 >= _ViewHight){
rightDowen = true
}else if(myLocation.x/2 == _ViewWidth && myLocation.y/2 == _ViewHight){
middle = true
}
NSLog("leftTop:\(leftTop), rightDown:\(rightDowen)")
//手势识别后设置手势状态
if(leftTop == true && rightDowen == true || middle == true){
self.state = UIGestureRecognizerState.Ended
}
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
}
override func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) {
//手势结束后重置
var leftTop = false
var rightDowen = false
var middle = false
self.reset()
}
}