您的位置:首页 > 移动开发 > IOS开发

iOS学习笔记1 -- 触摸与手势

2015-12-18 17:34 162 查看

iOS学习笔记1 – 触摸与手势

触摸

手势

触摸

触摸响应方法

响应者链

响应者链的时间传递过程

UIview不接受触摸事件的3中情况

事件

补充

触摸响应方法

如果想通过自定义事件响应用户触摸事件,则通过UIResponder的4个方法实现:

1:• -(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event;

当用户手指开始触摸控件时触发

2:• -(void)touchesMoved:(NSSet )touches withEvent:(UIEvent )event;

当用户手指在空间上移动时触发

3:• -(void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event;

当用户手指结束触摸控件(手指抬起)时触发

4:• -(void)touchesCancelled:(NSSet )touches withEvent:(UIEvent )event;

当系统事件(电话呼入,内存不足)终止触摸事件时触发该方法

响应者链

在iOS中不是所有对象都能响应时间,只有继承UIResponder的对象就可以作为事件的响应者.在iOS的UI控件中不是继承UIview就是继承UIControl,而UIControl继承UIview,,UIview继承了UIResponder,故所有的UI控件都能响应事件.

响应者链:每一个时间都有一个响应链,包含众多时间响应者.用户和一个控件开始交互(点击,滑动等等)时第一响应者是该控件,作为响应者链的开始,然后事件由响应者链开始传递直到被某个响应者处理(没有处理这丢弃不管).

响应者链的时间传递过程

•通常来说第一响应者(响应者链的开始)是某个UIview或者UIview子类控件,用户开始交互是时间由该控件自己处理

•如果控件不能处理则传到该空间对应的视图控制器

•如果视图控制器不能处理则传到该控件的父view

•重复第二第三步,当最底层view还不能处理是则传到UIwindow

•如果UIwindow还不能处理则传递到UIApplication的委托对象即AppDelegate

•如果还不能处理则丢弃

UIview不接受触摸事件的3中情况

•不接受用户交互userInteractionEnable = NO;比如UILabel,UIImageView等控件userInteractionEnable默认值为no,要交互则需要手动改为YES

•隐藏:hidden=YES;

•����透明:alpha=0.0~0.01;

事件(UIEvent)

•����一个UITouch表示一个触摸

•����一个UIEvent表示一个时间

•����事件对象包含当前多点触摸相对应的所有对象

•获取触摸事件的坐标



补充

当触摸一次和两次响应不同方法是,我们会发现点击两次会同时触发点击一次和点击两次的方法,我们可以改写一下就可以只响应点击两次

•����1)第一种方法在方法中判断tapCount

•����2)第二种先延迟执行点击一次的方法,如果在规定事件内有第二次点击这取消执行方法,否则执行点击一次的方法



[self performSelector:@selector(tap) withObject:nil afterDelay:0.4];方法中的afterDelay是延迟时间

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tap) object:nil];取消执行方法

手势

������������通过touches��������方法监听事件,不容易区分用户的具体手势行为.故苹果推出了手势处理器��(UIGestureRecognizer)

使用手势处理器处理用户手势的步奏

UIGestureRecognizer常用方法和属性

手势–点击

手势–捏合

手势–旋转

手势–轻扫

手势–拖动

手势–长按

使用手势处理器处理用户手势的步奏

1:根据程序要处理的手势创建对应的手势处理器对象.并指定对应的target和action参数(该控件发生创建的手势后,改target和action方法会响应).

2:如果该UI控件不允许交互则userInteractionEnable要手动设为YES,如果希望多点交互mutipleTouchEnabled属性要设为YES.

3:调用该UI控件的addGestureRecognizer:方法添加手势处理器

UIGestureRecognizer常用方法和属性

• - (CGPoint)locationInView:(UIView*)view;返回手势在的view控件中的触摸位置(相对控件左上方的坐标)

• - (NSUInteger)numberOfTouches;返回手势触点数量

• view��:返回激发手势的UI控件

• enabled��:设置和返回手势控制器是否可用

• state��:获取该手势的状态

UIGestureRecognizerStateBegan:手势刚开始

UIGestureRecognizerStateChanged:手势改变时

UIGestureRecognizerStateEnded:手势结束时状态

手势–点击

• UITapGestureRecognizer(点击手势) 除了拥有其父类(UIGestureRecognizer)的方法,还有提供了两个属性

• numberOfTapsRequired:指定手势只处理触摸(点击)几次的事件

• numberOfTouchesRequired��: 指定只处理几个手指(触摸点)的触摸事件



手势–捏合

• UIPinchGestureRecognize(捏合手势) 和UITapGestureRecognizer(点击手势) 使用步奏相同,同样除了拥有其父类(UIGestureRecognizer)的方法,还有提供了两个属性

• scale:获取捏合比例

• velocity:获取捏合速度



手势–旋转

• UIRotationGestureRecognizer(旋转手势),使用步奏和上面两个一样,除了父类方法属性有两个获取旋转相关的信息

• rotation:获取旋转角度

• velocity:获取旋转速度



手势–轻扫

• UISwipeGestureRecognizer(轻扫手势),步奏父类同,两个轻扫的属性

• numberOfTouchesRequired:设置值处理几个手指的触摸事件

• direction:枚举值,设置该处理器只处理某个方向(up,down,right,left)的轻扫事件



手势–拖动

• UIPanGestureRecognizer(拖动),步奏父类同,两个拖动的属性

• maximumNumberOfTouches:设置最多支持几个手指拖动

• minimumNumberOfTouches:设置最少需要几个手指拖动

此外还有两个方法获取有关拖动的信息:

• translationInView:获取手指在控件上的位移.返回一个CGPoint类型,x代表水平位移值,y值代表垂直方向位移值

• -velocityInView:获取手势在控件上的速度.同样返回一个CGPoint类型值,x代表水平速度,y值代表垂直速度(想到了高中物理速度分解).



手势–长按

��������������������������在用户用一个或多个手指在屏幕上长按,不松开的过程中,可以用UILongPressGestureRecognizer来检测到用户的这种手势

• UILongPressGestureRecognizer 步奏父类同,有一下属性设置手势处理器相关信息

• minimumPressDuration: 指定用户至少按多长时间触发长按手势.默认0.5s

• allowableMovement: 指定手势允许用用户手指移动的最大距离,超过这个距离这手势失败.

• numberOfTouchesRequired:指定用户必须几个手指按在屏幕上长按多久才能触发长按手势



上面代码长按一次会打印两次”触发长按手势”,因为在长按手势开始和结束都会触发一次handleLongPress:方法.其实是响应了不同状态的才会多次触发该方法.故我们需要在handleLongPress:里面加上判断

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: