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

来源:互联网 发布:人体工学椅 入门 知乎 编辑:程序博客网 时间:2024/04/28 08:18

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:里面加上判断
    手势长按2

0 0
原创粉丝点击