一、事件的基本概念
     1、事件概述
  • 事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象。
  • 系统将事件按照特定的路径传递给可以对其进行处理的对象。
  • 在iOS汇总,一个UITouch对象表示一个触摸,一个UIEvent表示一个事件。事件对象中包含与当前多点触摸序相对应的所有触摸对象,还可以提供与特定视图或窗口相关联的触摸对象。
  • 事件有三种:触摸事件,晃动事件,远程事件。
二、触摸的基本概念
     1、触摸概述
  • 触摸信息有时间和空间两方面,时间方面的信息称为阶段(phrase),表示触摸是否刚刚开始,是否正在移动或处于静止状态,以及何时结束——也就是手指何时从屏幕抬起。触摸信息还包括当前在视图窗口中得位置信息,以及之前的位置信息(如果有的话)。当一个手指接触屏幕时,触摸就和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维护。
     2、触摸时间的处理方法
          在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发          
          送这些消息:
  • 当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。
  • 当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。
  • 当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。

三、响应者链

     1、响应者链概述
  • 响应者链是一个响应者对象的链接序列,时间或动作消息(或菜单编辑消息)依次传递。它允许响应者对象把事件处理的职责转交给其它更高层的对象。应用程序通过向上传递一个事件来查找合适的处理对象。因为点击检测视图也是一个响应者对象,应用程序在处理触摸事件时也可以利用响应链。
  • 由多个响应者对象组成的链。
     2、响应者
  • iOS中所有能响应事件(触摸、晃动、远程事件)的对象都是响应者。
  • 系统定义了一个抽象的父类UIResponder来表示响应者。其子类都是响应者。
     3、检测碰撞视图
  • 硬件检测到触摸操作,会将信息交给UIApplication,开始检测。
  • UIApplication->window->viewController->view->检测所有子视图
  • 最终确认触碰位置,完成响应者链的查询过程。
  • 图示:
     4、处理触摸事件
  • 检测到响应者后,实现touchesBegan:withEvent:等方法,即处理事件。
  • 如果响应者没有处理事件,事件会向下传递。如果没有响应者处理,则丢弃触摸事件。
  • 事件处理的顺序与触摸检测查询相反。
  • 触摸的子视图->view->viewController->window->UIApplication。
     5、阻断响应者链
  • 响应者链可以被打断。无法
  • ionEnabled。关闭后能阻断查询过程。
  • userInteractionEnabled会阻断视图检测的过程,默认不阻断
  • 值为NO,从当前视图开始到所有子视图不再检测
        viewB.userInteractionEnabled = NO;
     6、响应者链处理原则
  • 点击检测视图或者第一响应者传递事件或动作消息给它的视图控制器(如果它有的话);如果没有一个视图控制器,就传递给它的父视图。
  • 如果一个视图或者它的视图控制器不能处理这个事件或动作消息,它将传递给该视图的父视图。
  • 在这个视图层次中的每个后续的父视图遵循上述的模式,如果它不能处理这个事件或动作消息的话。
  • 最顶层的视图吐过不能处理这个事件或动作消息,就传递给UIWindow对象来处理。
  • 如果UIWindow对象不能处理,就传给单件应用程序对象UIApplication如果应用程序对象也不能处理这个事件或者动作消息,将抛弃它。
四、手势
     1、手势识别器概述
  • 手势识别器是对触摸事件做了封装,手势识别器本身起到了识别作用。
  • 手势识别器是iOS中别叫抽象的一个类,用于识别一个手势,所谓手势:有规律的触摸。
     2、手势分类:轻拍手势,长按手势,旋转手势,捏合手势,平移手势,轻扫手势,屏幕边界平移手势。
     3、使用手势识别器:系统提供的手势识别器这个抽象父类我们是不会直接使用的,而是根据需求使用特定的手势识别器创建对象,系统所提供的手势类型如下:
  • UITapGestureRecognizer是轻拍手势识别器,能识别轻拍操作;
  • UILongPressGestureRecognizer是长按手势识别器,能识别长按操作;
  • UIRotationGestureRecognizer是旋转手势识别器,能识别旋转操作;
  • UIPinchGestureRecognizer是捏合手势识别器,能识别捏合操作;
  • UIPanGestureRecognizer是平移手势识别器,能识别拖拽操作;
  • UISwipeGestureRecognizer是轻扫手势识别器,能识别拖拽操作;
  • UIScreenEdgePanGestureRecognizer是屏幕边缘轻扫识别器。
     4、创建手势识别器
  • 创建UIxxxGestureRecognizer对象,使用initWithTarger:action:方法
  • 配置要识别的手势的相关信息
  • 将手势添加到某个视图上
  • 实现手势识别器里定义的方法
     5、View的transform属性
    • transform是view的一个重要属性,它在矩阵层面上改变view的显示状态,能实现view的缩放、旋转、平移等功能。
    • 平移:CGAffineTransformMakeTranslation
    • 缩放:CGAffineTransformMakeScale
    • 旋转:CGAffineTransformMakeRotation
    • 部分手势代码示例:

iOS学习之事件处理的更多相关文章

  1. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  2. 2015最新iOS学习线路图

    iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置 ...

  3. iOS学习——核心动画之Layer基础

    iOS学习——核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  4. iOS学习笔记之触摸事件&UIResponder

    iOS学习笔记之触摸事件&UIResponder 触摸事件 与触摸事件相关的四个方法如下: 一根手指或多根手指触摸屏幕 -(void)touchesBegan:(NSSet *)touches ...

  5. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  6. iOS学习-压缩图片(改变图片的宽高)

    压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...

  7. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  8. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  9. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

随机推荐

  1. note name

    谦谦君子:借用<周易·谦>:“初六,谦谦君子,用涉大川,吉.” 温润如玉:化用<诗经·卫风·淇奥>“有匪君子,如切如磋,如琢如磨”之义.

  2. Linux使用常见错误集锦

    1. scp拷贝文件失败问题 当在 shell startup script (比如 profile , bashrc)自动执行过程中产生了任何内容输出时, scp / sftp会把这些 echo 回 ...

  3. 使用.NET MVC框架项目开发流程(项目开发流程)

    MVC项目开发流程 整理需求,进行需求分析.项目设计. 整理数据项,建数据库做前期准备,并整理字典. 建立所需数据库表和视图和模型. 页面实现其初步功能(跳过逻辑后台代码),只是实现页面之间的跳转以及 ...

  4. windows svn

    1.1Svn和VisualSvn介绍 VisualSvn Server2.5.6(版本控制服务器)免费开源软件 是基于Windows平台上的Subversion服务器,它是免费的 官方下载: http ...

  5. css定义表格样式

    table.gridtable { font-family: verdana,arial,sans-serif; font-size:11px; color:#333333; border-width ...

  6. 008sudo用户管理

    1.Sudo是Unix/Linux平台上一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的权利,让它们执行一些只有超级用户或其他特许用户才能完成的任务(主要体现为命令),比如,运行一些像mo ...

  7. (转载)Android content provider基础与使用

    android有一个独特之处就是,数据库只能被它的创建者所使用,其他的应用是不能访问到的,所以如果你想实现不同应用之间的数据共享,就不得不用content provider了.在Android中,co ...

  8. Linux manual中命令标号的含义

    如果查看Linux manual(例如,执行:man open), 会发现文档中有这样的表达方式:read(2), write(2), lseek(2), fcntl(2)等,括号中的数值表达什么含义 ...

  9. select @@IDENTITY

    用select @@identity得到最新一次插入记录时自动产生的ID 如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY 说明: 在一条 INSERT.SEL ...

  10. varnish状态引擎2

    如何让varnish支持虚拟主机: if (req.http.host = "www.nihao.com") { } 强制对某资源的请求,不检查缓存: 上图表示以/test1.ht ...