(五十二)触摸事件初步

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 *)event
NSSet是一个无序集合,区别于数组的有序性。

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)。




posted on 2015-02-15 19:20  张大大123  阅读(177)  评论(0编辑  收藏  举报

导航