iOSUI-事件处理

事件的产生以及传递

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

1.当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中.

2.UIApplication会从事件队列中取出最前面的事件,交给主窗口window.

3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件

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

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

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

1.不接收用户交互时不能够处理事件

userInteractionEnabled = NO

2.当一个控件隐藏的时候不能够接收事件

Hidden = YES的时候

3.当一个控件为透明的时候也不能够接收事件

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

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

如何寻找最合适的View?

1.先判断自己是否能够接收触摸事件,如果能再继续往下判断,

2.再判断触摸的当前点在不在自己的身上.

3.如果在自己身上,它会从后往前遍历子控件,遍历出每一个子控件后,重复前面的两个步骤.

4.如果没有符合条件的子控件,那么它自己就是最适合的View

hitTest方法

作用:寻找最适合的View

参数:当前手指所在的点.产生的事件
返回值:返回谁, 谁就是最适合的View.
什么时候用调用:只要一个事件,传递给一个控件时, 就会调用这个控件的hitTest方法

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

pointInside方法

作用:判断point在不在方法调用者上

point:必须是方法调用者的坐标系
什么时候调用:hitTest方法底层会调用这个方法,判断点在不在控件上.
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    return YES;

}

hitTest方法底层实现

作用:当一个事件传递给当前View的时候就会调用这个方法.

当前手指在屏幕上的点

当前产生的事件

-(UIView *)hitTest:(CGPoint)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]){
        return nil;
    }
   //查看自己是不是最适合的view
   //从后往前遍历自己的子控制器.
    int count = (int)self.subviews.count;
    for (int i = count - 1; i >=0; i--) {
       //取出子控制器.
        UIView *childView = self.subviews[i];
      // 要把当前的点转换成子控件上的坐标点.
        CGPoint childP =  [self convertPoint:point toView:childView];
        UIView *view = [childView hitTest:childP withEvent:event];
        //如果有值,直接返回,返回的就是最适合的View.
        if (view) {
            return view;
        }
    }
    //没有找到比自己更适合的View.自己就是最适合的View
    return self;
}

事件的响应

事件响应过和程

用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件,
找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理

那这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理

什么是响应者链条,响应者对象

是由多个响应者对象连接起来的链条.

继承了UIResponder对象我们称之为响应者对象,也就是能处理事件的对象.

事件传递与响应的完整过程

在产生一个事件时,系统会将该事件加入到一个由UIApplication管理的事件队列中,
UIApplication会从事件队列中取出最前面的事件,将它传递给先发送事件给应用程序的主窗口.
主窗口会调用hitTest方法寻找最适合的视图控件,找到后就会调用视图控件的touches方法来做具体的事情.
当调用touches方法,它的默认做法, 就会将事件顺着响应者链条往上传递,

传递给上一个响应者,接着就会调用上一个响应者的touches方法

如何去寻找上一个响应者

1.如果当前的View是控制器的View,那么控制器就是上一个响应者.
2.如果当前的View不是控制器的View,那么它的父控件就是上一个响应者.
3.在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
4.如果window对象也不处理,则其将事件或消息传递给UIApplication对象

5.如果UIApplication也不能处理该事件或消息,则将其丢弃

事件传递的完整过程

1.先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件。

2.调用最合适控件的touches….方法

3.如果调用了[super touches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者

4.接着就会调用上一个响应者的touches….方法

时间: 2024-10-12 20:29:47

iOSUI-事件处理的相关文章

第三十八课、Qt中的事件处理(上)

一.图形界面应用程序的消息处理模型 二.Qt的事件处理 1.Qt平台将系统产生的消息转换为Qt事件(每一个系统消息对象Qt平台的一个事件) (1).Qt事件是一个QEvent的对象 (2).Qt事件用于描述程序内部或者外部发生的动作 (3).任意的QObject对象都具备事件处理的能力 2.GUI应用程序的事件处理方式 (1).Qt事件产生后立即被分发到QWidget对象 (2).QWidget中的event(QEvent*)进行事件处理 (3).event()根据事件类型调用不同的事件处理函数

Unit02: jQuery事件处理 、 jQuery动画

Unit02: jQuery事件处理 . jQuery动画 jQuery实现购物车案例 <!DOCTYPE html> <html> <head> <title>购物车</title> <meta charset="utf-8" /> <style type="text/css"> h1 { text-align:center; } table { margin:0 auto; wi

第38课 Qt中的事件处理(上)

1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个QEvent的对象 ②Qt事件用于描述程序内部或外部发生的动作 ③任意的QObject对象都具备事件处理的能力 (2)GUI应用程序的事件处理方式 ①Qt事件产生后立即被分发到QWidget对象 ②QWidget中的event(QEvent*)进行事件处理 ③event()根据事件类型的不同,调用不

UI_04 事件处理

?.事件 iOS 有三种事件类型: 触控事件(UIEventTypeTouches):单点.多点触控以及各种手势操作: 传感器事件(UIEventTypeMotion):重力.加速度传感器等: 远程控制事件(UIEventTypeRemoteControl):远程遥控iOS设备多媒体播放等: ?.触摸的基本概念 UIView?持触摸事件(因为继承于UIResponder),?且?持多点触摸.需要定义UIView?类,实现触摸相关的?法. 事件处理方法 UIResponder中定义了一系列对事件的

jQuery事件处理

1.使用jQuery实现事件绑定 语法: $obj.bind(事件类型,事件处理函数) 如: $obj.bink('click',fn); 简写形式 $obj,click(fn); 注: $obj.click()则代表触发了click事件. 2.获得事件对象event 只需要为事件处理函数传递任意一个参数 如: $obj.click(function(e){...}) e就是事件对象,但已经经过jQuery对底层事件对象的封装 封装后的事件对象可以方便的兼容各浏览器 3.事件对象常用的属性 获取

添加和移除事件处理兼容各浏览器的封装(带详细注释)

//事件处理兼容各种浏览器,采用能力检测方法,所谓能力检测,就是有能力就做,没有能力就不做 //定义一个处理事件的对象,兼容各种浏览器,dom2级事件处理和ie事件,如果这两个事件都不兼容,就采用dom0级处理 var eventUtil ={ addEvent:function(element,type,handler){ if (element.addEventListener) { //非IE浏览器采用dom2级事件处理,type为事件类型如:click,handler为事件处理函数,fa

android基于监听的事件处理

android利用监听器来实现事件处理,有多种方法: //以下下import 包部分省略,复制时请自行导入 Activity本身作为事件监听器 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layo

009-手势触摸事件处理

问题一:iOS中有哪些事件? •在用户使用app过程中,会产生各种各样的事件 •iOS中的事件可以分为3大类型 问题二:什么叫响应者对象? •在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” •UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 问题三:UIResponder内部提供了哪些处理事件的方法来处理事件? •UIRes

nagios 事件处理机制

接到zz的任务,实现自动化处理nagios某项报警 脑海里有个印象,这个功能之前线下做过实验 一.首先必须查看下nagios的官方文档,确认可行,以下是笔者整理的一些自认为有用的信息 1)了解命令的定义方法Writing Event Handler CommandsEvent handler commands will likely be shell or perl scripts, but they can be any type of executable that can run from

【Sprint3冲刺之前】日历表的事件处理和管理(刘铸辉)

我的Sprint2冲刺--日历表的事件处理和管理(刘铸辉,刘静) 我的Sprint2冲刺计划领到的任务是和静姐结对编程,完成日历表的事件处理和管理,下面详细讲解下技术细节. 1.设计结构图 首先要画出整个UI设计图,方便理解这个日历布局和日历样式的绘制. 这里总共分解为两个 View 文件: 1:calender_main.xml(Calender.java用来绘制日历表和日历表中的事件) 作为启动的主画面,新建项目时,首先生成. schedule_toptext:用来显示年月日,闰几月,年份和