ios开发事件处理之 :二:事件的产生与传递

1.事件是怎么样产生与传递的?

当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中.(队列是先进先出,而栈是先进后出)

UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理.首先交给主窗口keywindow去处理

主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,当找到最合适的view来处理事件时,该view会调用touchBegan等方法来对事件进行处理

2:时间传递的先后顺序以及注意点:

触摸事件的传递是从父控件传递到子控件的.

如果一个父控件不能接收事件,那么它里面的了子控件也不能够接收事件.

3:一个控件什么情况下不能够接收事件:

1.不接收用户交互时不能够处理事件:如果父控件不能与用户交互,那么子控件也不会接收到触摸事件,那么触摸事件最后就会传递给父控件的父控件去处理

userInteractionEnabled = NO

2.当一个控件隐藏的时候不能够接收事件:当一个父控件隐藏后,其上的子控件也就会被隐藏,也就是父控件不能接受触摸事件的时候,其上的子控件也不能接受触摸事件

Hidden = YES的时候

3.当一个控件为透明白时候也不能够接收事件:当一个父控件透明的时候,子控件也会是透明的,当透明度在0.0 - 0.01之间的时候,该控件不能去接受触摸事件(透明度为0的时候,就是完全透明,0.0 - 0.01包含0.0和0.01这两个值)

注意:UIImageView的userInteractionEnabled默认就是NO,

因此UIImageView以及它的子控件默认是不能接收触摸事件的

4:UIEvent:每产生一个事件就会产生产生一个UIEvent对象。UITouch为触摸对象,一根手指触摸就会产生一个UITouch对象,两根手指触摸就会产生两个UITouch对象。UIEvent还提供了相应的方法获得在某个view上的触摸对象UITouch

5:事件的传递示例如图所示:

1:事件的传递顺序

2: 如图所示新建四个不同颜色的view,分别在四个view中实现touchbegan方法,1:四个view中有相同的代码,则抽成父类直接在父类中实现touchbegan方法,让子类去继承,如何在父类中区分不同的子类,可以通过在父类中查看self.class来查看子类所属的class,或是父类暴露type接口,子类去重写父类的方法,则在父类中父类就可以根据赋值的type类型来判断不同的子类,让不同的子类在父类的方法中实现不同的方法。子类继承父类后,就拥有了父类所有的代码,若是想子类和父类发生关联进行数据传递,则父类可以暴露方法供子类去重写,1:子类可以重写父类的方法获得不同于父类的内容   2:父类暴露接口设置返回值,子类重写后,则父类就可以拿到子类重写的方法中的返回值(get方法接口)2:若是先创建了xib文件,想把xib中的某个控件封装起来,则可以自定义xib中的类,继承系统的类,然后来到xib中,对要封装的控件进行类的关联:如图:

1:1:当设置黄色view的userInteractionEnabled = NO,点击黄色的view后,事件是由父控件传递到子控件,若父控件不能接受事件,则子控件也不能去接受事件(3个条件会使控件不能接受点击事件),事件由橙色--蓝色,此时的view不能与用户交互,所以事件不能传递到黄色的view处,只能传递到蓝色的view,蓝色view能处理事件,则会调用其touchBegan方法 2:当设置蓝色view的userInteractionEnabled = NO,点击黄色的view,事件只会传递到橙色的view处,蓝色不能接受触摸事件,所以事件不会传到蓝色view处,也就不会传到黄色的view处。所以事件由橙色view去处理

2:1:如下图:UIImageView默认userInteractionEnabled = NO,UIImageView和其上的子控件都不能接受到触摸事件,默认在xib中是不能再UIImageView上添加子控件的,可以通过代码添加 2:还有一种就是透明度的设置,在0.0-0.01之间的透明度,父控件透明子控件也会透明,父控件隐藏,则子控件也会隐藏,则其父控件和子控件都不会接受到触摸事件

时间: 2024-10-12 13:47:21

ios开发事件处理之 :二:事件的产生与传递的相关文章

IOS开发—事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 二.UIResponder UIResponder内部提供了以下方法来处理事件触摸事件- (v

从零开始学ios开发(十二):Table Views(上)

这次学习的控件非常重要且非常强大,是ios应用中使用率非常高的一个控件,可以说几乎每个app都会使用到它,它就是功能异常强大的Table Views.可以打开你的iphone中的phone.Messages.Contacts.Mail.Settings等等等等,这些都用到了Table Views. 在Table Views中,Table是用来显示一系列数据的,每条数据占用且只占用一行(一个table cell),在ios中没有规定table到底可以容纳多少行数据,也就是说,只要内存足够多,tab

iOS开发-定制多样式二维码

iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常见的二维码功能包括信息获取.网站跳转.电商交易.手机支付等等,其拥有密度小.信息容量大.容错能力强.成本低.制作难度低等优点.在移动开发中,二维码的地位也越来越重要,掌握二维码的基本操作是重要的本领之一. 在iOS7之后,苹果自身集成了二维码的生成和读取功能.生成二维码包括以下步骤 1.导入CoreIm

iOS开发UINavigation系列二——UINavigationItem

iOS开发UINavigation系列二--UINavigationItem 一.引言 UINavigationItem是导航栏上用于管理导航项的类,在上一篇博客中,我们知道导航栏是通过push与pop的堆栈操作来对item进行管理的,同样,每一个Item自身也有许多属性可供我们进行自定制.这篇博客,主要讨论UINavigationItem的使用方法. UINavigationBar:http://my.oschina.net/u/2340880/blog/527706. 二.来说说UINavi

iOS开发系列之二 - UILabel 用法小结

// 初始化标签 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 300, 150)]; // 设置标签文字 label.text = @"This is a test text.This is a test text.This is a test text."; // 设置标签文字字体 // 使用系统字体 label.font = [UIFont systemFontOfSize:20]; //

从零开始学ios开发(十二):Table Views(中)UITableViewCell定制

我们继续学习Table View的内容,这次主要是针对UITableViewCell,在前一篇的例子中我们已经使用过UITableViewCell,一个默认的UITableViewCell包含imageView.textLabel.detailTextLabel等属性,但是很多时候这些默认的属性并不能满足需要,其实更多的时候我们想自己制定UITableViewCell的内容,这篇学习的就是制定自己的UITableViewCell. UITableViewCell继承自UIView,因此它可以加载

iOS开发中视图控制器ViewControllers之间的数据传递

iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storyboard中传递数据. 首先新建一个空工程,并添加一个根视图控制器类,如下图所示: # 在函数didFinishLunchingWithOption中添加几行代码,完成后如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 - (BOOL)application:(UIApplication

ios开发事件处理之:三 :寻找最合适的view

1:事件的产生与传递: 2:寻找最合适的view:如何查找最合适的view:需要三步:1:先判断自身是否能接受触摸事件 2:判断触摸点是否在自己身上 3:若前两条都满足,则其会从后往前遍历所有子控件(从后往前遍历是考虑到效率的问题,后指的是子控件数组中的最后一个控件)继续重复12步骤,直到找到最合适的子控件.(控件不能接受触摸事件的三个条件,事件是由父控件传递到子控件,若是父控件都不能接受事件,那么子控件肯定也不能接受事件) : 注意:从后往前遍历子控件:永远遍历的是子控件数组中的最后一个,也就

ios开发事件处理之:五:事件的响应