手势和触控基础知识
触摸控制 是 iOS 系统交互的核心方式。
触控
Cocoa Touch 以尽可能简单地方式实现了直接的操控。它会把触控事件发送给你正在进行交互的视图。
每一次触控都会转达很多的信息: 触控发生的位置,点击屏幕的次数,触控发生的时间。
iOS 使用 响应链 (responder chain) 来确定究竟是哪个对象应该对触控做出响应。 响应者(responders)是响应 事件(event) 的对象。 这些响应者扮演的角色就好比是一串管理者,对这些 事件(event)进行管理。当用户触摸屏幕时,应用会去寻找一个对象来处理这一个触控事件。 触摸(touch)被传递下去,从一个视图到另外一个视图,直到一些对象来接管并且对这个 事件(event)做出响应。
在大多数情况下,触摸(touches)以及其信息 被存储在 UITouch 对象中,触摸(touches)以组的形式在 UIEvent 对象中传递。每一个 UIEvent 对象都代表了一个单一的 触控事件,包含一次或多次触摸。这一点既决定了开发者如何去响应用户的操作,也决定了用户怎么在屏幕上进行操作。
你的应用通过 视图(UIView 或其子类的实例对象) 或者 视图控制器(UIViewController 或其子类的实例对象) 来接收 触摸(touches)。实现处理 触摸(touch)的类需要通过继承 UIResponder 类来实现。 你将会决定在哪儿处理和响应这些 触摸(touches)。 那些尝试不使用 responder 类来实现简单手势控制的开发新人会遇到很多麻烦。
在视图上处理 触摸(touches) 看似违反直觉。你可能想去把界面显示的方式和它对 touches 做出响应的方式分离开。进一步说,视图直接响应触控来实现交互看似违反了 MVC 设计模式,但是这样做是很有必要的,而且可以提高封装性。
阶段
touches 是具有生命周期的。任意一个 touch 都会经历五个阶段。
- UITouchPhaseBegan - 当用户刚接触屏幕的时候
- UITouchPhaseMoved - 当这个接触动作在屏幕上移动时
- UITouchPhaseStationary - 当一个接触动作在屏幕上停止住时
- UITouchPhaseEnded - 当用户的手指从屏幕上移开时
- UITouchPhaseCancelled - 当 iOS 系统停止跟踪一个 touch 时。 通常发生在,系统中断或者是视图从窗口移除或者是处在非激活状态(有来电)。
这五个阶段用来划分一个触控事件发生过程中的整个流程。
触控和响应方法
所有 UIResponder 类的子类,包括 UIView 和 UIViewController 都会对 touches 做出响应。每一个类都决定了自身是否响应或者是如何去响应。当需要去做出响应时,这些类的实例会对用户的触控按照自己的方式进行响应。
预定义的回调方法能处理触控开始,触控移动,触控结束这几种情形。和 阶段(Phase)相对应。方法如下:
- touchesBegan: withEvent: - 在触控刚刚发生的时候被调用
- touchesMoved: withEvent: - 在触控移动的时候被调用
- touchesEnded: withEvent: - 在触控结束的时候被调用
- touchesCancelled: withEvent: - 当系统强行中断触控事件的时候,该方法会被调用(举例:你正在刷微博,突然有人来电,如果对该方法进行重载,那么该方法就是在此刻被调用的)
上面的每一个方法都属于 UIResponder 方法,通常在 一个 UIView 或是 UIViewController 的子类中进行实现。
这些方法内部并没有实现什么功能。当你想把触控动作添加到应用时,就应该重载这些方法,实现自己需要的功能。
注意:在UITouchPhaseStationary 阶段,没有方法会被回调。
手势识别器
通过手势识别器类,当用户进行轻击、缩放、旋转、横扫、拖动或是一个长按动作时,我们可以触发回调方法。
几种常见的手势
- Taps - 轻击,一指或多指
- Swipes - 横扫
- Pinches - 捏缩
- Rotations - 双指进行视图的旋转
- Pans - 拖拽进行平移
- Long presses - 长按
本人正在进行 iOS 开发进阶学习。希望借助简书这个平台和志同道合的朋友一起交流,互促互进。该笔记的主体为译文,也会有一些个人的想法和总结,如有不正确或者不合理的地方,还望各位朋友指正! :)