(五十二)触摸事件初步
iOS中的事件分为三类:
1.触摸事件
2.加速计事件(摇晃等)
3.远程控制事件(例如线控)
响应者对象:
在iOS中不是任何对象都能处理事件,只有继承自UIResponder的对象才能接受和处理消息,称之为“响应者对象”。
UIApplication、UIViewController、UIView都继承字UIResponder,因此都可以处理事件。
UIResponder提供了相应的方法来处理各类事件。
触摸事件以touches开头,注意touchesCancelled方法是被电话等打断触摸过程时,会调用这个方法。
加速计事件以motion开头。
远程控制事件以remote开头。
【UIView的触摸】
完整的触摸过程:touchesBegan -> touchesMoved -> touchesEnded.
每一个触摸函数都有两个参数:NSSet对象和UIEvent对象。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)eventNSSet是一个无序集合,区别于数组的有序性。
touches集合装的是UITouch对象,要取出元素,可以使用anyObject方法。
UITouch:当用户用一根手指触摸屏幕时,会创建一个与手指相关的UITouch对象,每一根手指对应一个UITouch对象。
UITouch保存着的是触摸的位置、时间、阶段等信息,当手指移动时,会更新同一个UITouch。
需要注意的是,View默认情况下不支持多点触控,要先更改属性Multiple Touch:
【触摸移动View的样例】
拿到触摸位置的方法:先拿到touch对象,然后通过locationInView:方法来获得CGPoint对象,坐标原点是locationInView对应的视图左上角。
拿到当前位置的方法:
UITouch *touch = [touches anyObject]; CGPoint current = [touch locationInView:self];拿到上一个触摸点位置的方法:
CGPoint previous = [touch previousLocationInView:self];触点移动的方向和距离与View应该移动的方向和距离是一致的,因此只需要用当前点减去上一个点,就可以得到相应的变化量。
为了方便改变View的位置,可以使用center属性,center的x、y变化量为两次触摸点坐标的变化量Δx和Δy
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; // 当前触摸点 CGPoint current = [touch locationInView:self]; // 上一个触摸点 CGPoint previous = [touch previousLocationInView:self]; // 修改当前view的位置(中点) CGPoint center = self.center; center.x += current.x - previous.x; center.y += current.y - previous.y; self.center = center; }
需要注意的是,如果是UIViewController方法要捕捉触摸事件,传入的为self.view,方法只接收View对象。
除去NSSet对象,还有一个UIEvent对象,表示的是事件的一些属性,例如有类型属性表示事件的类型(例如调整音量)。
Tip:一次完整的触摸过程中,只会产生一个事件对象。
Tip:两根手指同时触摸同一个view,只调一次touchesBegan:withEvent方法,touches中有两个UITouch对象储存两根手指的触控信息;如果是一前一后的触摸同一个view,则会调用两次touchesBegan...方法,并且每次touches中只有一个UITouch对象;touches中的UITouch个数可以判断是单点触摸还是多点触摸。
Tip:UITouch中有window、view属性判断触摸产生时所处的窗口和视图,tapCount可以记录短时间内点按屏幕的次数(判断单击、双击等),phase可以得到触摸事件所处的状态(Began、Moves、Ended)。