原文链接:https://www.jianshu.com/p/3778a218191b
都是别人翻译的,很牛
关于iOS的事件
用户操作iOS设备的方式有很多种,比如触摸屏幕、摇晃设备。当用户操作硬件时,iOS系统就会将这些事件进行捕获,然后翻译成事件信息传递给手机的应用程序进行处理,这样你的程序就可以对用户的人为动作进行识别并响应,当然,你的程序所支持的动作和响应越丰富,那么程序的用户体验就会越好。
1. 随意瞄一瞄
所有的事件都以对象的方式发送给应用程序,以告之其用户的操作信息。在iOS中,事件发生的形式有很多种:Multi-Touch(多指触摸)事件,motion(手势,如tap、slide等)事件,以及控制多媒体的事件。最后的那个控制多媒体的事件,比较典型的就如远程控制事件,其事件源头来自于外部感应器。
1.1 UIKit框架使得app感知用户手势操作变得简单
iOS app可以识别各种触摸集合事件,并直观而形象地对这些事件进行响应,比如用户通过两根手指对屏幕上的某个区域进行捏合或分离(pinch)操作来缩放,使用滑动手势(flick)对屏幕某一分内容进行翻动。
一些常见的手势基本上都直接在UIKit框架中构建集成(开发者可以直接使用)。举个例子,UIControl的子类,比如UIButton、UISlider,可以对用户的特定手势直接响应。Button直接响应用户的点击(tap)事件,Slider直接响应用户的滑动事件。开发者通过对这些控件进行配置,这些控件就会给特定的目标实例发送 触摸事件 的消息。
当然,你也可以直接使用手势识别类(gesture recognizer)让iOS视图类(view)体现target-action机制(以对用户的特定的操作进行响应)。开发者可以将“手势识别类(gesture recognizer)的实例" 和 "某个视图实例" 进行绑定,就可以像control(控制类)那样,对某用户手势操作进行响应。
手势识别类(gesture recognizer)为开发者提供了复杂事件处理逻辑的高度抽象接口,功能强大、可复用、适配性,自然是开发者实现对用户触摸事件处理的首选。开发者可以直接使用已集成(内建)的手势识别类,并自定义其处理动作,当然也可以自定义手势识别类来处理新的用户手势操作。
1.2 每一个事件都沿着特定路径去查找能够处理它的对象
当iOS捕获到某个事件时,就会将此事件传递给某个看上去最适合处理该事件的对象,比如触摸事件传递给手指刚刚触摸位置的那个视图(view),如果这个对象无法处理该事件,iOS系统就继续将该事件传递给更深层的对象,直到找到能够对该事件作出响应处理的对象为止。这一连串的对象序列被称作为“响应链”(responder chain),iOS系统就是沿着此响应链,由最外层逐步向内层对象传递该事件,亦即将 “处理该事件的责任” 进行传递。iOS的这种机制,使得事件处理具有协调性和动态性。
1.3 一个UIEvent既是一个触摸(touch)、一个摇晃(shake-motion),或者一个远程控制(remote-control)事件
大部分事件都是UIKit的UIEvent类的实例。一个UIEvent类的实例,包含了app该如何响应Event的信息。当一个客户手势发生的时候,iOS就会不断地发生event对象给app,让app来处理该事件,例如,当客户手指滑过手机屏幕的时候就是一个事件。一个event对象既是触摸、也是摇晃、也是远程控制事件、又或者时远程控制事件的子类。
1.4 当用户运动设备时,APP会接收到运动事件
运动事件提供的信息包括设备的位置、方向和活动信息。通过激活运动事件,开发者可以为应用程序添加微妙而强大的功能特性。加速器和陀螺仪数据使得开发者可以检测设备的倾斜、翻转和摇晃事件。
运动事件的来源不一样,开发者处理这些事件所需要的框架也随之而变。用户摇晃设备时,UIKit框架就会传递一个UIEvent对象给应用程序。如果开发者想要接受高频率的、连续性的加速器和陀螺仪数据,就需要使用Core Motion框架。
1.5 当用户操作多媒体控制器时,APP会接收到远程控制事件
iOS控制器和外部感应器会向APP发送远程控制事件信息。这些事件允许用户控制音频和视频,比如调整扬声器的音量、视频播放的进度等。对多媒体远程控制事件的处理,就需要开发者的APP对这些类型的指令进行响应。
2. 预备知识
该文档默认读者具备以下知识属性:
- iOS APP开的基础概念
- 创建APP用户界面的不同层面
- 视图和视图控制器如何运作,以及如何自定义视图和视图控制器
如果读者对以上内容不熟悉,请自行阅读相关书籍。比如通过阅读《Start Developing iOS Apps Today 》入门,然后阅读《View Programming Guide for iOS》或者 《View Controller Programming Guide for iOS 》,都看了也行。
3. 参考
iOS设备在提供触摸和设备运动事件的同时,大部分的iOS设备也集成有有GPS和指南针硬件,开发者的APP对它们所生成的底层数据,可能也会感兴趣。《Location Awareness Programming Guide 》讨论如何接受并处理这些位置信息数据。
更高级的手势识别技术比如曲线滤波和应用低通滤波器,请参见《WWDC 2012: Building Advanced Gesture Recognizers 》。
许多本书涉及的样例代码都有关于手势识别器和事件处理的代码,其中包含以下项目:
x. 《Simple Gesture Recognizers 》: 理解手势识别的完美开始。此APP展示了如何识别tap、swipe和rotate手势,并根据不同的手势对触摸处的图片进行展示和动画效果处理。
x. 《Touches 》包含了另个项目,展示了多点触摸和在屏幕内对矩形进行拖拽。一个版本使用了手势识别,另一个版本使用了自定义触摸事件处理方法。后面那个版本对于理解“触摸事件”尤其有意义,因为在触摸发生时直接在屏幕上对其进行展示。
x. 《MoveMe》展示了当触摸事件发生时如何对图片进行动画处理。仔细阅读该项目可以帮助读者更深层的理解自定义触摸事件处理。
手势识别器(Gesture Recognizer)
手势识别器将底层的事件处理代码转换为高层的动作处理,开发者可以将其与视图类(view)进行绑定,从而使得视图类可以像控制器一样对这些动作进行响应。
手势识别器识别用户的触摸动作,并确定是否和一些特定的手势动作相匹配,比如swipe(划)、pinch(捏)或者rotation(转)。如果识别器识别出来的和特定手势动作一致,就会向与之绑定的对象发送一条消息。目标对象通常是视图所在的视图控制器实例,从而对手势动作发生响应,如图1-1所示。这种设计模式简单而强大,开发者可动态的决定视图需要对什么样的手势动作进行响应,在不添加任何新的视图类的情况下,为任何视图实体类添加手势识别器。
1.使用手势识别器简化事件处理
UIKit框架提供内建的手势识别器来检测常见的手势动作。如果可能的话,使用内建的手势识别器是最佳选择,因为它们极大的减少了开发者的代码量。另外,使用标准的手势识别器而不是开发者自定义的可以保证