编程

当前位置:永利皇宫463登录 > 编程 > iOS事件传递和响应,iOS事件的传递和拍卖

iOS事件传递和响应,iOS事件的传递和拍卖

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-18 02:14

1.3风云的传递和管理

事件的产生和传递

1.当发出触摸事件时,系统会将该事件加多到UIApplication管理的事件队列中.2.UIApplication会从事件队列中抽取最前面包车型地铁事件,并将事件传递给应用程序的主窗口(keyWindow).3.然后主窗口会依照view的等级次序结构找到适合的view来拍卖触摸事件.4.找到合适的view后系统就能够调用view的touches方法处理事件.

UIView不接收触摸事件的三种情况

1.不接受用户交互(userInteractionEnabled = NO). 2.隐藏(hidden = YES). 3.透明(alpha = 0.00~0.01).

小心:UIImageView的userInteractionEnabled属性默以为NO,所以暗中认可意况下UIImageView和子视图是不接受触摸事件的.

事件的传递示例

永利皇宫463登录 114635575603143.jpg

备考:数字一样表示一点差异也未有父控件.

事件的传递是从父控件传递到子控件1>点击了茶褐view:UIApplication-->UIWindow-->灰色view-->米白view2>点击了浅橙view:UIApplication-->UIWindow-->黄铜色view-->橄榄黑view-->深藕红view3>点击了色情view:UIApplication-->UIWindow-->朱红view-->品蓝view-->浅蓝view-->油红view怎么样鲜明适合的view处总管件?

递归下面的步骤:1>自己是否能接收触摸事件?否,事件传递到此结束2>触摸点是否在自己身上?否,事件传递到此结束3>从后往前遍历子控件,重复前面两个步骤4>如果没有符合条件的子控件,那么自己就是最合适处理事件的view

在意:假诺父控件无法吸收接纳触摸事件,则子控件就不恐怕抽取触摸事件.分明合适view的最底层完成

/*寻找合适view相关方法(UIView的方法)*//*1.作用:寻找最合适的view2.什么时候调用:当事件传递给控件的时候,就会调用控件的这个方法,去寻找最合适的view3.point:当前的触摸点,point这个点的坐标系就是方法调用者*/- hitTest:point withEvent:(UIEvent *)event;// 作用:判断当前这个点在不在方法调用者上- pointInside:point withEvent:(UIEvent *)event;// 将指定点的坐标系转化成对应view的坐标系- convertPoint:point toView:view;

- hitTest:point withEvent:(UIEvent *)event{ // 1.判断当前控件能否接收事件 if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil; // 2. 判断点在不在当前控件 if ([self pointInside:point withEvent:event] == NO) return nil; // 3.从后往前遍历自己的子控件 NSInteger count = self.subviews.count; for (NSInteger i = count - 1; i >= 0; i--) { UIView *childView = self.subviews[i]; // 把当前控件上的坐标系转换成子控件上的坐标系 CGPoint childP = [self convertPoint:point toView:childView]; // 调用子控件的hitTest:withEvent:方法 UIView *fitView = [childView hitTest:childP withEvent:event]; if  { // 寻找到最合适的view return fitView; } } // 循环结束,表示没有比自己更合适的view return self;}

管理进程

1.客商点击显示屏后发生三个触摸事件,经过一名目好多的传递进度后,会找到最合适的视图控件来管理这么些事件.2.找到最合适的视图控件后,就能够调用控件的touches方法来抓实际的风浪管理.3.这么些touches方法的默认做法正是将事件顺着响应者链条前进传递,将事件交给上贰个响应者实行管理.

1.响应者链条:是由多个响应者对象连接起来的链条. 2.作用:能很清楚的看见每一个响应者之间的联系,并且可以一个事件让多个响应者对象处理. 3.响应者对象:能处理事件的对象.

永利皇宫463登录 214635648526952.jpg

事件的一体化的传递进程

1.先是事件对像从上往下传递(父控件传递给子控件),找到最合适的控件处理事件.2.系统调用最合适view的touche方法.3.固然调用了[super touches...]格局(事件的私下认可管理顺序)就能够将事件顺着响应者链条向上传递,传递给上二个响应者.4.接着就能够调用上二个响应者的touches方法.

1.假若当前view是调控器的view,控制器正是上几个响应者.2.假如当前view不是调节器的view,那么父控件就是上三个响应者.

响应者链的风浪传递进程1.假使view的调整器存在,就将事件传递给调节器管理,若是调整器一纸空文,就将事件传递给父控件管理.2.假使视图档期的顺序结构的世界级视图不可能处管事人件,就将事件传递给UIWindow实行管理.3.假诺UIWindow也无法处总管件,将事件传递给UIApplication实行管理.4.假若UIApplication也不无法管理该事件,则系统将事件舍弃.

1.响应者对象
  • 在iOS中不是别的对象都能处总管件, 唯有承袭了UIResponder的目的本事接到并处监护人件,大家誉为响应者对象
  • UIApplication,UIViewController,UIView都无冕自UIResponder,由此他们都以响应者对象, 都能够吸收并处总管件

Modal

  • 除外push之外,那是其他一种调整器的切换形式
  • 其余调控器都能经过Model的款型体现出来
  • 以Model 的款式显得调节器:presentViewController:
  • 关门当初Model出来的调节器:dismissViewControllerAnimated:
  • 使用时机:前后八个调整器未有稍微音讯逻辑上的拖累时;当前后调整器有料定逻辑上的层级关系时,用 UINavigationController 和 push
  • modal出哪个人,什么人就有职务dismiss
  • 哪个人modal调节器,什么人也是有职分dismiss
2.UIResponder

UIResponder内部提供了以下情势来处总管件

触摸事件- touchesBegan:touches withEvent:(UIEvent *)event;- touchesMoved:touches withEvent:(UIEvent *)event;- touchesEnded:touches withEvent:(UIEvent *)event;- touchesCancelled:touches withEvent:(UIEvent *)event;加速计事件- motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;- motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;- motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;远程控制事件- remoteControlReceivedWithEvent:(UIEvent *)event;

iOS 中的事件

  • 在客商选拔app进度中,会发出有滋有味的平地风波
  • 大概分为3大类型
    • 1.触摸事件
    • 2.加快计事件
    • 3.远程序调节制事件
  • 响应者对象:在iOS中不是另外对象都能处监护人件,唯有传承了UIResponder的指标手艺接到并处总管件
  • UIApplicaiton UIViewController UIView 都承接自 UIResponder,因而它们都是响应者对象,都能够接收并处总管件。

永利皇宫463登录 3

图片 12.png

  • UITouch
    • 当客户用一根手指触摸显示器时,会成立二个与手指相关连的UITouch对象
    • 一根手指对应七个UITouch对象
    • UTouch 的功用:保存着跟手指相关的音讯,比如触摸的地点、时间、阶段
    • 永利皇宫463登录,当手指运动时,系统会更新同叁个UITouch对象,使之能力所能达到平素保留该手指在的触动地方
    • 当手指离开荧屏时,系统会销毁相应的UITouch对象。
  • UIEvent
    • 每发生四个事变,就能够发出四个UIEvent对象
    • UI伊芙nt:称为事件目的,记录事件发生的随时和花色。
    • UIEvent还提供了对应的点子能够获取在有些view上面的磋磨对象UITouch

永利皇宫463登录 4

图片 13.png

3.UIView的触摸事件管理
UIView是UIResponder的子类,可以覆盖下列4个方法处理不同的触摸事件一根或者多根手指开始触摸view,系统会自动调用view的下面方法- touchesBegan:touches withEvent:(UIEvent *)event一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)- touchesMoved:touches withEvent:(UIEvent *)event一根或者多根手指离开view,系统会自动调用view的下面方法- touchesEnded:touches withEvent:(UIEvent *)event触摸结束前,某个系统事件会打断触摸过程,系统会自动调用view的下面方法- touchesCancelled:touches withEvent:(UIEvent *)event提示:touches中存放的都是UITouch对象

事件的发出与传递

  • 发出与传递进程

    • 发出触摸事件后,系统会将该事件加入到三个由UIApplicaiton处理的事件队列中。
    • UIApplication会致力件队列中收取最前头的平地风波,并将事件分发下去以便管理。平常,首发送事件给应用程序的主窗口(keyWindow)
    • 主窗口会在视图档案的次序结构中找到一个最合适的视图来管理触摸事件,那也是成套事件经过的首先步
    • 找到适当的视图控件后,就能调用视图控件的touches方法来作具体的事件管理。
  • 触摸事件的传递从父控件传递到子控件。

  • 倘使父控件不收受触摸事件,那么子控件也不会经受触摸事件。

  • 如何找到最合适的控件来处监护人件

    • 1.投机能还是无法接受触摸事件
    • 2.触摸点是还是不是在投机随身
    • 3.从后往前遍历子控件,重复前面包车型客车2个步骤
    • 4.一旦没有符合条件的子控件,那么就协和最契合管理
  • UIView不接受触摸事件的3中状态

    • 1.userInterationEnabled = NO
    • 2.hidden = YES
    • 3.alpha = 0 ~ 0.01
    • UIImageView的 userInterationEnabled默认是 NO
4.UITouch
当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象一根手指对应一个UITouch对象UITouch的作用保存着跟手指相关的信息,比如触摸的位置、时间、阶段当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置当手指离开屏幕时,系统会销毁相应的UITouch对象提示:iPhone开发中,要避免使用双击事件!

UITouch的属性

触摸产生时所处的窗口@property(nonatomic,readonly,retain) UIWindow *window;触摸产生时所处的视图@property(nonatomic,readonly,retain) UIView *view;短时间内点按屏幕的次数,可以根据tapCount判断单击、双击或更多的点击@property(nonatomic,readonly) NSUInteger tapCount;记录了触摸事件产生或变化时的时间,单位是秒@property(nonatomic,readonly) NSTimeInterval timestamp;当前触摸事件所处的状态@property(nonatomic,readonly) UITouchPhase phase;

UITouch的方法

- locationInView:view;返回值表示触摸在view上的位置这里返回的位置是针对view的坐标系的(以view的左上角为原点调用时传入的view参数为nil的话,返回的是触摸点在UIWindow的位置- previousLocationInView:view;该方法记录了前一个触摸点的位置

UIEvent

每产生一个事件,就会产生一个UIEvent对象UIEvent:称为事件对象,记录事件产生的时刻和类型常见属性事件类型@property(nonatomic,readonly) UIEventType type;@property(nonatomic,readonly) UIEventSubtype subtype;事件产生的时间@property(nonatomic,readonly) NSTimeInterval timestamp;UIEvent还提供了相应的方法可以获得在某个view上面的触摸对象

touches和event参数

一次完整的触摸过程,会经历3个状态:触摸开始:- touchesBegan:touches withEvent:(UIEvent *)event触摸移动:- touchesMoved:touches withEvent:(UIEvent *)event触摸结束:- touchesEnded:touches withEvent:(UIEvent *)event触摸取消:- touchesCancelled:touches withEvent:(UIEvent *)event4个触摸事件处理方法中,都有NSSet *touches和UIEvent *event两个参数一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数如果两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象根据touches中UITouch的个数可以判断出是单点触摸还是多点触摸

hitTest、pointInside

  • 怎么时候调用:当事件传递给控件的时候,就能够调用控件的这些主意。
  • hitTest功效:为了寻找最合适的view
  • 重写该办法,能够转移事件本来的传递与管理流程
  • 底层实现:递归
  • point:当前的触摸点,point那一个点的坐标系便是艺术调用者
  • pointInside:剖断当前的触摸点是或不是在不在方法调用者上?
  • 子控件超越父控件,是不可以处总管件的,除非重写hitTest:方法。
5.轩然大波的发出和传递
发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理touchesBegan…touchesMoved…touchedEnded…

永利皇宫463登录 5事件传递.png

UIView不接收触摸事件的二种情况

1. 不接收用户交互userInteractionEnabled = NO2. 隐藏hidden = YES3. 透明alpha = 0.0 ~ 0.01 , 设置父控件的alpha值,则子控件的alpha也响应的改变提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的

如上海体育场所,大家创立一个BaseView,里面落成touchBegin方法,方法中打字与印刷[self class],代号为1,2,3,4的视图分别承袭于BaseView如上海体育地方, 假设大家把代号为3的铁红的userInteractionEnabled设置为NO,则我们点击代号为4的色情视图,则响应点击事件的为代号为2的橘色视图, 事件传递不下来了,如若大家点击代号为3的杏黄视图, 则响应点击事件举行拍卖的为代号为2的橘色视图

如何找到最合适的控件来处理事件?自己是否能接收触摸事件?触摸点是否在自己身上?从后往前遍历子控件,重复前面的两个步骤如果没有符合条件的子控件,那么就自己最适合处理系统默认的方法:写成代码则为: [self.view.window hitTest: withEvent:(UIEvent *)]; [self.view.window hitTest: withEvent:(UIEvent *)]; 这个方法的作用:用来寻找最合适的view

// 事件传递的时候调用// 什么时候调用:当事件传递给控件的时候,就会调用控件的这个方法,去寻找最合适的view// 作用:寻找最合适的view//// point:当前的触摸点,point这个点的坐标系就是方法调用者- hitTest:point withEvent:(UIEvent *)event{ // 调用系统的做法去寻找最合适的view,返回最合适的view UIView *fitView = [super hitTest:point withEvent:event]; NSLog(@"fitView--%@",fitView); return fitView;}// 作用:判断当前这个点在不在方法调用者上// 根据上面的查找最合适View的方法顺序-->对应上面的 触摸点是否在自己身上的这个步骤- pointInside:point withEvent:(UIEvent *)event{ return YES;}

hitTest的最底层达成:

// 因为所有的视图类都是继承BaseView- hitTest:point withEvent:(UIEvent *)event{// NSLog(@"%@--hitTest",[self class]);// return [super hitTest:point withEvent:event]; // 1.判断当前控件能否接收事件 if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil; // 2. 判断点在不在当前控件 if ([self pointInside:point withEvent:event] == NO) return nil; // 3.从后往前遍历自己的子控件 NSInteger count = self.subviews.count; for (NSInteger i = count - 1; i >= 0; i--) { UIView *childView = self.subviews[i]; // 把当前控件上的坐标系转换成子控件上的坐标系 CGPoint childP = [self convertPoint:point toView:childView]; UIView *fitView = [childView hitTest:childP withEvent:event]; if  { // 寻找到最合适的view return fitView; } } // 循环结束,表示没有比自己更合适的view return self; }

以上正是事件的传递, 那么事件是怎么响应的呢?

1. 用户点击屏幕产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件2. 找到最合适的视图控件后,就会调用控件的touches方法来做具体的事件处理 a. touchesBegin.. b. touchesMoved..等等3. 如果我们不重写上面的touches方法,那么这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理

比方: 上海教室土稻草黄的视图大家不重写touchBegin方法, 灰湖绿视图的父控件青色视图,我们重写浅橙视图的touchBegin方法, 那样假诺我们点击浅豆绿视图, 那么牡蛎白接受了touchBegin事件,将事件传递给上贰个响应者,而父控件完成了那几个措施, 所以父控件管理点击事件, 管理完就不接二连三传递了..假使大家达成了淡红视图的touchBegin事件,那么铁锈红视图的响应事件本人管理, 就不会向上一个响应者传递了

假虚构让那八个视图都得以吸取事件并都管理,那么大家在古铜黑控件的touchBegin方法这么写:

- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // 处理事件 NSLog(@"%s", __func__); // 继续传递向上传递 super->父类 [super touchesBegan:touches withEvent:event];}

永利皇宫463登录 6总结.png

一经事件结尾传递给UIApplicatian的时候, UIApplicatian会将一切事件销毁, 没人处理

响应者链条

  • 概念:是由几个响应者对象连接起来的链子
  • 职能:能很明白的看见每一个响应者之间的关系,并且能够让四个日子多个对象管理
  • 响应者对象:能处管事人件的靶子

永利皇宫463登录 7

图片 15.png

  • 事件传递的一体化经过

永利皇宫463登录 8

图片 16.png

  • 响应者链的事件传递进度
    • 只要view的调节器存在,就传递给调节器;假诺调控器不真实,则将其传递给它的父视图
    • 在视图档次结构的最一级视图,就算也不能够处理收到的事件或新闻,则其将事件或消息传递给window对象开展拍卖
    • 只要window对象也不管理,则其将事件或音讯传递给UIApplication对象
    • 设若UIApplication也不能处理该事件或音信,则将其放弃

手势识别

  • 选择UIGestureRecognizer,能轻轻易松识别客户在有个别view上边做的一部分广阔手势
  • 手势连串
    • 1.点按 tap
    • 2.长按 longPress 长按手势,私下认可触发三回
    • 3.轻扫 swipe 暗中同意轻扫的趋向是从左 ——> 右;假若之后想要一个控件帮忙多少个趋势的轻扫,必须创立四个轻扫手势,一个轻扫手势只扶助贰个侧向
    • 4.筋斗 rotation 私下认可传递的团团转的角度是相持于最早始的职位
    • 5.缩放 scale
    • 6.拖拽 pan
  • 暗中同意不帮助四个手势,须要遵从合同 < UIGestureRecognizerDelegate > ,重写方法。
  • 情商业中学的方法包括有:是不是允许触发手势,是还是不是允许手指的触摸点(能够兑现手势区域触发)

tips:

- 1.怎么样把C语言字符串转化为OC字符串?

    char *c = "abc";
    NSLog(@"%@", [@(c) class]);

本文由永利皇宫463登录发布于编程,转载请注明出处:iOS事件传递和响应,iOS事件的传递和拍卖

关键词:

上一篇:消息推送原理,iOS远程消息推送原理

下一篇:没有了