UI 事件处理

it2026-05-19  10

一 > 事件的基本概念 事件概述 : UIEvent  ( vent]事件  )  事件,是由硬件捕捉的一个表示用户操作设备的对象分三类 : 触摸事件 ,晃动事件 ,远程控制事件触摸事件 : 用户通过触摸设备屏幕操作对象 , 输入数据 ,支持多点触摸 ,包含1个到多个触摸点  最多支持11个点触摸事件的类型:  multitouch events : 多点触摸   ,, , accelerometer [ək,selə’rɒmɪtə]  events  : 加速度计的事件   ..remote control events : 远程控制事件   二> 触摸的基本概念 UIView 支持触摸事件 ( 因为继承于UIResponder ) ,而且 支持多点触摸需要定义UIView 子类 ,实现触摸相关的方法 方法由 touches …began 开始接触… ; touches..moved 触摸移动 ; touches ,,ended  触摸结束 ; touches ..canceled ( kan shou) 触摸取消 ; 方法的使用: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {     NSLog(@"开始触摸"); //控制view 的背景颜色      self.backgroundColor = [UIColor colorWithRed:MMM green:MMM blue:MMM alpha:1];         // 一个手指     UITouch *touch = [touches anyObject];     //------> 需要定义一个变量 ,局部变量是不行的     //手指在view上的点 (最开始的点)  (得到手指在view的位置: locationInView ,它返回的是CGPoint ) // 最开始的点    _startPoint = [touch locationInView:self]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {     NSLog(@"开始移动");     //先拿到一个点     UITouch *touch = [touches anyObject];     // 当前点 ------>     CGPoint currentPoint = [touch locationInView:self];     //拿到当前点的值减去 开始点的值 等于 偏移量     CGFloat offSetX =currentPoint.x - _startPoint.x;     CGFloat offSetY =currentPoint.y - _startPoint.y;         CGPoint newCenter = self.center;     newCenter.x = newCenter.x + offSetX;     newCenter.y = newCenter.y + offSetY;     // 将新的中心点给本身view 的中心点     self.center = newCenter;     self.backgroundColor = [UIColor colorWithRed:MMM green:MMM blue:MMM alpha:1];                 } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {     NSLog(@"停止触摸"); } -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {       NSLog( @“触摸取消");   } ————> 使用触摸是实现手势 手势 : 有规律的触摸UITouch 代表触摸在屏幕上的一根手指 .可以获取触摸时间和触摸位置如何获取touch对象 ,touches 集合中包含了视图上的所有手势 UIEvent : 事件,由硬件捕获到的一个表示用户操作设备的对象 事件分为三类: 触摸事件 ,晃动事件 ,远程控制事件 重点 :触摸事件,一个触摸事件包括一个或多个TUtouch 对象 (手指 )  iPhone最多支持11个点.   ———>UIResponder : 响应者 是可以响应事件并且可以对其进行处理的对象UIResponder 是响应者的基类 ,UIApplication ,UIView 和 从UIView 派生出来的子类都是源自它第一响应者是当前正在接受事件的响应者对象 ————>UITouch (手指 )  表示触摸事件中的一个手指UIView 支持触摸事件( 因为继承于 UIResponder  )  ,而且支持多点触摸 —————>想实现触摸必须实现这几个方法     ————>触碰检测 通过触碰检测找出Touch 发生在哪个视图上 ,递归检测多有的子视图,定位准确位置   二> 响应者链 响应者链是有一个一个响应者组成的长链响应者链定义了ios中触摸事件的交互规则如果HIt - test 检测出的view 没有响应事件 ,事件就会 沿着响应者链往下传递如果链中某个响应者响应了事件或者已经没有响应者了,传递就会结束作用 :能清楚的看到每个响应者之间的联系,并且可以让一个事件多个对象处理响应者对象 : 能处理事件的对象 ————>事件传递的完整过程 1>现将事件对象由上往下传递( 由父控件传递给子控件 ) ,找到合适的控件来处理这个事件2>调用最合适控件的touches ..方法3>如果调用了[super touches ….] ,就会将事件顺着响应者链条往上传递 ,传递给上一个响应者4> 接着就会调用上一个响应者的touches..方法 ————> 如何判断上一个响应者 1> 如果当前这个view 是控制器的view ,那么控制器就是上一个响应者2>如果当前这个view 不是控制器的view ,那么父控件就是上一个响应者 —————>响应者链的事件传递过程 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,则其将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃     ———>调整事件传递 关闭事件的传递 : userInteractionEnabled 属性设置为NO  .此属性是UIView 的 ,所有子类都能设置.当视图Hidden 属性为YES 或者 alpha 为0时 ,视图也不接受事件 //将 移动停止的方法 (也就是触摸事件失效)        self.userInteractionEnabled = NO; 在一定时间内关闭事件传递: 应用程序调用 UIApplication 的 beginIgnoringInteractionEvents 和 endIgnoringInteractionEvents ;  Ignoring——>忽视 ,忽略   interaction [ɪntər'ækʃ(ə)n] 互动 UIView 不接收触摸事件的三种情况1> 不接受用户交互  :  userInteractionEnabled =NO;2>隐藏 hidden = YES ;3>3> 透明 : alpha = 0.0~0.01 ;提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的 ——> 多指触摸时需要打开 aView.multipleTouchEnabled = YES ;   ———.>   检测触碰视图 硬件检测到触摸操作 ,会将信息 交给UIApplication,开始检测 UIApplication ->window -> viewController -> view ->检测所有子视图最终确认触碰位置,完成响应者链的查询过程 ————> 处理触摸事件  检测到响应者后 ,实现touchesBegan : withEvent : 等方法,即处理事件如果响应者没有处理事件,事件会向下传递,如果没有响应者处理,则丢弃触摸事件事件处理的顺序呢与触摸检测的顺序相反触摸的子视图 ->view ->viewController ->window ->UIApplication      三>   手势 识别    typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {     //  没有触摸事件发生,所有手势识别的默认状态     UIGestureRecognizerStatePossible,     //  一个手势已经开始但尚未改变或者完成时     UIGestureRecognizerStateBegan,     //  手势状态改变     UIGestureRecognizerStateChanged,     //  手势完成     UIGestureRecognizerStateEnded,     //  手势取消,恢复至Possible状态     UIGestureRecognizerStateCancelled,      //  手势失败,恢复至Possible状态     UIGestureRecognizerStateFailed,     //  识别到手势识别     UIGestureRecognizerStateRecognized =  UIGestureRecognizerStateEnded };           ——> 切换 两个view视图的代码 //按钮的响应事件 -(void)blueAction:(UIButton *)sender {     NSLog(@"绿色按钮点击了一下");     if( [_BVC.view  superview] ==nil)     {         [_GVC.view removeFromSuperview];         [self.view addSubview:_BVC.view];                 [self.view sendSubviewToBack:_BVC.view];                 } }   ——>视图控制器的切换 工程     二> 试图控制器 的触摸实现  

转载于:https://www.cnblogs.com/ryc--520/p/4803311.html

最新回复(0)