1:事件的产生与传递:

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

注意:从后往前遍历子控件:永远遍历的是子控件数组中的最后一个,也就是最后添加到父视图上的子控件

上图中的子控件的添加顺序:1:先添加的是红色的控件view,再添加蓝色的控件view,随后添加黄色,绿色,最后添加紫色

例如:当点击绿色的view后,系统会将事件发送到UIApplecation管理的事件队列中,UIApplecation会从事件队列中取出最前端的事件交给主窗口KeyWindow,此时KeyWindow做判断自己可以接受触摸事件,触摸点在自己的身上,满足两个条件,此时KeyWindow会寻找有没有更合适的view,此时KeyWindow会从后往前遍历子控件,拿到子控件白色的view后继续判断是否满足两个条件,不满足则事件不会继续传递,若满足,则白色的view又会从后往前遍历子控件,先查看白色控件子控件数组中的最后一个也就是蓝色控件,在查看紫色的view,在查看黄色的view,再看看绿色的view,是否满足条件,不满足则停止传递或是继续传递给子控件,停止传递的原因就是涉及到用户交互的问题,若是子控件也不能接收事件,则此时自己也就是父视图为最合适的view,父视图会对此事件进行处理(ViewUI,最顶层是UIWindow,记住最重要一点是:事件的传递是由父控件传递到子控件,父控件不能接受事件则子控件也不能接收事件,控件不能接受触摸事件的三个条件)

3:事件传递调用的最底层的方法:1:当view接收到触摸事件的时候就会调用,-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 方法底层会调用,-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event。在调用第一个方法的时候会先调用第二个方法。2:一般若是想反悔任意一个view处理点击事件,则一般考虑在父视图中重写两个方法,在第一个方法中反回子控件的view

//作用:去寻找最适合的View

//什么时候调用:当一个事件传递给当前View,就会调用.

//返回值:返回的是谁,谁就是最适合的View(就会调用最适合的View的touch方法)

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{

NSLog(@"%s",__func__);

UIView *fitView = [super hitTest:point withEvent:event];

//NSLog(@"%@",fitView);

//return  self.subviews[0];

return fitView;

}

//作用:判断当前点在不在它调用View,(谁调用pointInside,这个View就是谁)

//什么时候调用:它是在hitTest方法当中调用的.

//注意:point点必须得要跟它方法调用者在同一个坐标系里面

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{

NSLog(@"%s",__func__);

return NO;

}

ios开发事件处理之:三 :寻找最合适的view的更多相关文章

  1. 寻找最合适的view

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. ios开发事件处理之 四:hittest方法的底层实现与应用

    #import "XMGWindow.h" /** 1:注意点:hitTest方法内部会调用pointInside方法,询问触摸点是否在自己身上,当遍历子控件时,传入的坐标点要进行 ...

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

    1.事件是怎么样产生与传递的? 当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中.(队列是先进先出,而栈是先进后出) UIApplication会从事件队列中 ...

  4. IOS开发之路三(XML解析之KissXML的使用)

    最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...

  5. IOS开发之路三(XML解析之GDataXML的使用)

    最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...

  6. ios开发runtime学习三:动态添加方法(实际应用少,面试)

    #import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...

  7. iOS 开发:TCP三次握手连接

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...

  8. 【Swift 2.2】iOS开发笔记(三)

    1.UITableView 中调用 UIButton 的 setTitle 会闪 滚动列表时比较明显,解决办法: buttonType 改成 custom 即可,但是这样一来 UIButton 的高亮 ...

  9. iOS开发常用第三库

    字典转模型 1.(MJExtension) https://github.com/CoderMJLee/MJExtension 2.(YYModel) https://github.com/ibire ...

随机推荐

  1. 《三》Java IO 字节输入输出流

    那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)     ...

  2. 用两个栈实现队列与用两个队列实现栈(Python实现)

    用两个栈实现队列: class QueueWithTwoStacks(object): def __init__(self): self._stack1 = [] self._stack2 = [] ...

  3. Direct2D开发:Direct2D 和 GDI 互操作性概述

    本主题说明如何结合使用 Direct2D 和 GDI(可能为英文网页).有两种方法可以结合使用 Direct2D 和 GDI:您可以将 GDI 内容写入与 Direct2D GDI 兼容的呈现器目标, ...

  4. 洛谷 P1334 瑞瑞的木板

    P1334 瑞瑞的木板 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了 ...

  5. 【Expression 序列化】WCF的简单使用及其Expression Lambada的序列化问题初步解决方案

    地址:http://www.cnblogs.com/guomingfeng/tag/Expression%E5%BA%8F%E5%88%97%E5%8C%96/

  6. FFmpegh.264解码

    - (int)DecodeH264Frames: (unsigned char*)inputBuffer withLength:(int)aLength { ; ; av_init_packet(&a ...

  7. AVCaptureSession音频视频采集

    // // AudioVideoCaptureViewController.m // live // // Created by lujunjie on 2016/10/31. // Copyrigh ...

  8. 对DataTable进行过滤筛选的一些方法Select,dataview

    当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到: DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FROM ...

  9. PythonNET网络编程4

    本地套接字 Linux 文件 b(块设备文件) c(字符设备文件) d(目录) -(普通文件) l(链接) s(套接字) p(管道) 作用:用于本地不同的程序间进行通信 创建流程 创建本地套接字 so ...

  10. 快速搭建REST API——json server

    一:全局安装json-server npm install json-server -g 二:在自己项目跟目录下存放mock/data.json,json内容如下: { "roles&quo ...