IOS 触摸与手势

触摸

响应者对象

在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象".

UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件.

UIView??????不接受触摸时间的三种情况??????????????????

    • •  ????不接受用户交互????????????userInteractionEnable = NO;??(例如:UILabel与UIImageView????这些控件userInteractionEnable默认为??????NO因此这些控件默认是不能接受触摸事件的)
    • •  ??隐藏:??hidden=YES;
    • •  透明:????alpha=0.0~0.01

      ????响应触摸的方法,可以通过UIResponder如下的四个方法来实现

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

      //当用户开始触摸时触发该方法

      •  -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;????????????????????//当用户手指开始移动时触发该方法

      •  -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;??????????//当用户触摸结束时触发该方法

      •  -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent*)event;??????????????????????????????//当系统事件(比如内存不足,电话呼入)终止了触摸事件时激发该方法

      //当用户开始触摸时触发该方法
      - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
      
      {
          NSArray *touchArr = [touches allObjects];//获取用户开始触摸时手指的数量
      
          UITouch *touch = [touchArr objectAtIndex:0];
      
          CGPoint point = [touch locationInView:[touch view]]; //获取开始触摸时手指的位置
      
      //    NSLog(@"%d",touch.tapCount);//获取手指短时间内点击的次数
      
          if (touch.tapCount == 1) {
              [self performSelector:@selector(tapOne) withObject:nil afterDelay:0.5];
              //延迟0.5秒调用方法tapOne
      
          }
          if (touch.tapCount == 2) {
              //如果用户要只是响应双击,销毁延迟调用
              [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tapOne) object:nil];
          }
      
      }
      
      -(void)tapOne
      {
          NSLog(@"点击一次");
      }
      //当用户手指开始移动时触发该方法
      - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
      {
          NSLog(@"手指移动");
      }
      //当用户触摸结束时触发该方法
      - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
      {
          NSLog(@"触摸手势结束");
      }
      //当系统事件(比如内存不足,电话呼入)终止了触摸事件时激发该方法
      - (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
      {
      
      }
      

      手势

      UITapGestureRecognizer   点击

       label = [[UILabel alloc]initWithFrame:CGRectMake(self.view.bounds.size.width/2-50, self.view.bounds.size.height/2-50, 100, 100)];
          label.backgroundColor = [UIColor greenColor];
          label.userInteractionEnabled = YES;
          [self.view addSubview:label];
      
          UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureHandle:)];
          tapGesture.numberOfTapsRequired = 1; //需要点击的次数
          tapGesture.numberOfTouchesRequired = 1; //需要1根手指点击
          [label addGestureRecognizer:tapGesture];
      -(void)tapGestureHandle:(UITapGestureRecognizer *)gesture
      {
          NSLog(@"点击触发");
          CGPoint point = [gesture locationInView:self.view]; //获取点击坐标
      //
      }

      UIPinchGestureRecognizer  捏合

         UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchGestureHandle:)];
          label.multipleTouchEnabled = YES; //允许支持多点触摸
          [label addGestureRecognizer:pinchGesture];
          
      -(void)pinchGestureHandle:(UIPinchGestureRecognizer *)gesture
      {
          CGFloat scale = gesture.scale; //获取用户捏合比例
          CGFloat velocity = gesture.velocity;  //获取用户捏合速度
          label.transform = CGAffineTransformScale(label.transform, scale, scale);
          gesture.scale = 1.0;
      
      }

      UIPanGestureRecognizer   拖拽

         UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureHandle:)];
          panGesture.maximumNumberOfTouches = 1; //允许该收拾处理器最多支持几个手指拖动
          panGesture.minimumNumberOfTouches = 1;//允许该收拾处理器最少支持几个手指拖动
          [label addGestureRecognizer:panGesture];
      -(void)panGestureHandle:(UIPanGestureRecognizer *)gesture
      {
          CGPoint point = [gesture translationInView:label]; // 获取控件位移
          label.transform = CGAffineTransformTranslate(label.transform, point.x, point.y);
          [gesture setTranslation:CGPointMake(0, 0) inView:label];
      
      }

      UISwipeGestureRecognizer  轻扫

      由于一个控件指甲一次轻扫手势只支持一个方向上的轻扫,如果需要四个方向上的轻扫手势,需要加四次

       for (int i = 0; i < 4; i ++) {
              UISwipeGestureRecognizer *swipGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipGestureHandle:)];
              swipGesture.numberOfTouchesRequired = 1;
              swipGesture.direction = 1 << i;
              [label addGestureRecognizer:swipGesture];
          }
      -(void)swipGestureHandle:(UISwipeGestureRecognizer *)gesture
      {
          if (gesture.direction == UISwipeGestureRecognizerDirectionRight) {
              NSLog(@"向右轻扫");
          }
          if (gesture.direction == UISwipeGestureRecognizerDirectionLeft) {
              NSLog(@"向左轻扫");
          }
          if (gesture.direction == UISwipeGestureRecognizerDirectionDown) {
              NSLog(@"向下轻扫");
          }
          if (gesture.direction == UISwipeGestureRecognizerDirectionUp) {
              NSLog(@"向上轻扫");
          }
      }

      UILongPressGestureRecognizer   长按

          UILongPressGestureRecognizer *longPress=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPress:)];
          longPress.minimumPressDuration=1;  //至少按下多少秒会触发手势
          longPress.allowableMovement=1;  //允许手指移动的最大距离
          longPress.numberOfTouchesRequired=1; //允许用户用几根手指触发该手势
      
          [_viewText addGestureRecognizer:longPress];

      使用长按手势来显示自定义菜单项

          UIMenuItem *transmItem = [[UIMenuItem alloc]initWithTitle:@"转发" action:@selector(transmItem:)];
          UIMenuItem *deleteItem = [[UIMenuItem alloc]initWithTitle:@"删除" action:@selector(deleteItem:)];
          UIMenuItem *reportItem = [[UIMenuItem alloc]initWithTitle:@"举报" action:@selector(reportItem:)];
      -(void)handleLongPress:(UILongPressGestureRecognizer *)gesture
      {
          if (gesture.state == UIGestureRecognizerStateBegan) {
              NSLog(@"长按手势");
              [self becomeFirstResponder];
              UIMenuController *menu=[UIMenuController sharedMenuController];
              [email protected][transmItem,deleteItem,reportItem];
              CGRect rect=CGRectMake(10, 10, 100, 50);
              [menu setTargetRect:rect inView:_viewText];
              [menu setMenuVisible:YES animated:YES];
          }
      
      }
      -(BOOL)canBecomeFirstResponder
      {
          return YES;
      }
      -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
      {
          if (action == @selector(transmItem:)||action == @selector(deleteItem:)||action == @selector(reportItem:))
          {return YES;}else{
              return NO;}
      }
      -(void)transmItem:(id)sender
      {
          NSLog(@"转发");
      }
      -(void)deleteItem:(id)sender
      {
          NSLog(@"删除");
      }
      -(void)reportItem:(id)sender
      {
          NSLog(@"转发");
      }

如果要是控件同时支持两个手势,需要导入

      #import <UIKit/UIGestureRecognizerSubclass.h>

并且,重写两个方法

//是否阻止另一个手势
-(BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)geature{
    return NO;
}
-(BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer
{
    return NO;
}
时间: 2024-10-17 23:40:31

IOS 触摸与手势的相关文章

说说iOS中的手势及触摸

一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会.当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方.事件将沿着响应者链一直向下传递,直到被接受并做出处理.一般来说,第一响应者是个视图对象或者其子类对

蓝懿IOS学习七大手势Touches

今天学习了ios编程里手势的方法及应用场景,屏幕页面中区分很多控件,有的控件可以有点击事件和用户直接交互,可以执行相应方法,如TextField,Button,UISEgmentControll等,但是静态lableUIImageView等就需要把交互开关打开,添加响应的手势才能实现交互. 刘国斌老师详细的对我们讲了七大手势,包括点击Touches,UIPanGestureRecognizer拖动,UILongPressGestureRecognizer长按手势,UIScreenEdgePanG

iOS开发摇动手势实现详解

1.当设备摇动时,系统会算出加速计的值,并告知是否发生了摇动手势.系统只会运动开始和结束时通知你,并不会在运动发生的整个过程中始终向你报告每一次运动.例如,你快速摇动设备三次,那只会收到一个摇动事件. 2,想要实现摇动手势,首先需要使视图控制器成为第一响应者,注意不是单独的控件.成为第一响应者最恰当的时机是在视图出现的时候,而在视图消失的时候释放第一响应者. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -(BOOL)canBecomeFirstRespond

触摸与手势

1. 触摸 触摸(Cocoa Touch)就是用户手指放在屏幕上一直到手指离开.触摸是在UIView上进行的.当用户触摸到屏幕时,触模事件就会发生.本节将主要讲解触摸的阶段以及这些阶段所对应的的方法. 1.1 触摸阶段 当用户的手指放在屏幕上就实现了触摸,但是触摸并不是一直持续的.当手指离开屏幕这一次触摸就结束了.这一次触摸共分为5个阶段.如下表所示: 触摸的5个阶段 触摸阶段 功能 UITouchPhaseBegan 手指刚触摸到屏幕 UITouchPhaseMoved 手指在屏幕上移动 UI

iOS开发之手势gesture详解(二)

与其他用户界面控件交互 UIControl子类会覆盖parentView的gesture.例如当用户点击UIButton时,UIButton会接受触摸事件,它的parentView不会接收到.这仅适用于手势识别重叠的默认动作的控制,其中包括: 一根手指单击动作:UIButton, UISwitch, UIStepper, UISegmentedControl, and UIPageControl. 一根手指擦碰动作:UISlider 一根手指拖动动作:UISwitch 包含多点触摸的事件 在iO

iOS开发之手势gesture详解(一)

前言 在iOS中,你可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势.GestureRecognizer将低级别的转换为高级别的执行行为,是你绑定到view的对象,当发生手势,绑定到的view对象会响应,它确定这个动作是否对应一个特定的手势(swipe,pinch,pan,rotation).如果它能识别这个手势,那么就会向绑定它的view发送消息,如下图 UIKit框架提供了一些预定义的GestureRecognizer.包含下列手势 UITapGestu

IOS触摸事件和手势识别

IOS触摸事件和手势识别 目录 概述 触摸事件 手势识别 概述 为了实现一些新的需求,我们常常需要给IOS添加触摸事件和手势识别 触摸事件 触摸事件的四种方法 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 开始触摸所触发的方法 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 移动时触发的方法 -(void)touchesEnded:(N

iOS触摸事件处理

iOS触摸事件处理 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在视图的层次结构里找到能响应消息的那个视图.(2)然后在找到的视图里处理消息. [关键](1)的过程是从父View到子View查找,而(2)是从找到的那个子View往父View回溯(不一定会往回传递消息). 1.1.寻找响应消息视图的过程可以借用M了个J的一张图来说明. 处理原理如下: • 当用户点击屏幕时,会产生一个触摸事件,系统会将该事件加入到一个由

在iOS上增加手势锁屏、解锁功能

在iOS上增加手势锁屏.解锁功能 在一些涉及个人隐私的场景下,尤其是当移动设备包含太多私密信息时,为用户的安全考虑是有必要的. 桌面版的QQ在很多年前就考虑到用户离开电脑后隐私泄露的危险,提供了“离开电脑自动锁定”或者“闲置锁定”等类似功能,具体我也忘了. 而在iPhone版的QQ上,也提供了手势锁的功能.如下图: 我在上一篇博文中简单提到如何根据手指移动画线条,而这里是进一步的版本,仍然只是粗糙原型: 具体的代码实现如下: [cpp]  //  //  ViewController.m  //