##DAY4  事件的基本概念、触摸的基本概念、响应者链、手势

#pragma mark ———————事件的基本概念 ———————————

事件的基本概念:

1)事件是当用户的手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象。

2)系统将事件按照特定的路径传递给可以对其进行处理的对象。

3)在iOS中,一个UITouch对象表示一个触摸,一个UIEvent对象表示一个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象,还可以提供与特定视图或窗口相关联的触摸对象。

事件类型:触摸事件、晃动事件、远程事件

#pragma mark ———————触摸的基本概念———————————

触摸的基本概念:

1)触摸信息有时间和空间两方面,时间方面的信息称为阶段 (phrase),表示触摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束—也就是手指何时从屏幕抬起。

2)触摸信息还包括当前在视图或窗口中的位置信息,以及之前的位置信息(如果有的话)。

3)当一个手指接触屏幕时, 触摸就和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维护。

触摸事件的处理方法:

在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息:

1)当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。

2)当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。

3)当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。

关于触摸,重要的几个方法:

1)获取触摸在屏幕上的手指对象:

UITouch *touch = [touches anyObject];

2)获取手指之前在屏幕上的位置:

CGPoint previousP = [touch previousLocationInView:self];

3)获取手指现在在屏幕上的位置:

CGPoint currentP = [touch locationInView:self];

#pragma mark ———————响应者链———————————

响应者链:

检测碰撞视图:

UIApplication -> window -> viewController -> view -> 检测所有子视图

处理触摸事件:

触摸的子视图 -> view -> viewController -> window -> UIApplication

阻断响应者链:

视图类的属性:userInteractionEnabled。关闭后能阻断查询过程。

注意:

1)响应者链阻断后,完成不了检测过程。检测过程完成不了,所以事件就触发不了

2)而控件阻断响应者链就是关闭用户交互,默认关闭用户交互的控件有UIImageView和UILabel

3)以后的项目开发中,如果想让UIImageView和UILabel响应事件,必须将其交互打开

#pragma mark ———————手势———————————

手势:

手势识别器是iOS中比较抽象的一个类,用于识别一个手势,所谓手势:有规律的触摸。

1)创建满足需求的手势,在创建时关联手势触发时的方法

2)配置手势的相关属性

3)将手势添加到需要执行的操作视图上面

4)实现手势方法,当发生触摸,手势识别器识别相应的触摸时,就会发生关联的方法

手势分类:

轻拍手势:UITapGestureRecognizer

属性:numberOfTouchesRequired:触发手势的手指个数

numberOfTapsRequired:触发手势的轻拍次数

轻扫手势:UISwipeGestureRecognizer

属性:direction 设置轻扫方向

长按手势:UILongpreesGestureRecongnzier

属性:minimumPressDuration 长按手势触发的最短时间,默认0.5

平移手势:UIPanGestureRecognizer

缩放手势:UIPinchGestureRecognizer

旋转手势:UIRotationGestureRecognizer

屏幕边界手势:

UIScreenEdgePanGestureRecognizer

注意:前三个有属性,后三个没有

手势的使用:

1)初始化:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];

2)设置属性:…

3)将手势加到需要通过触摸改变的视图上:

[imageView addGestureRecognizer:tap];

4)实现创建手势时添加的方法:

- (void)tapAction:(UITapGestureRecognizer *)tap {

//获取手势关联的视图

UIImageView *imageView = (UIImageView *)tap.view; //强转

//修改图片

[imageView setImage:[UIImage imageNamed:@"mao.jpg"]];

}

注意后三个手势方法实现:

平移手势:UIPanGestureRecognizer

- (void)panAction(UIPanGestureRecognizer *)pan{

//获取手势关联的视图

UIImageView *imageView = (UIImageView *)pan.view;

CGPoint p = [pan translationInView:imageView];

//改变imageView的形变属性

//1、发生回弹

//    imageView.transform = CGAffineTransformMakeTranslation(p.x, p.y);

//2、不发生回弹

imageView.transform = CGAffineTransformTranslate(imageView.transform, p.x, p.y);

//    CGPointZero 清零

[pan setTranslation:CGPointZero inView:imageView];

}

缩放手势:UIPinchGestureRecognizer

- (void)pinchAction:(UIPinchGestureRecognizer *)pinch{

//获取手势关联的视图

UIImageView *imageView = (UIImageView *)pinch.view;

//改变imageView的形变属性

//1、发生回弹,再次改变的时候会回到原来的基础上,然后改变

//    imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);

//仿射变换

//2、不发生回弹,根据CGAffineTransformScale 中的imageView.transform,进行缩放

imageView.transform = CGAffineTransformScale(imageView.transform, pinch.scale, pinch.scale);

//如果不设定,会发生累加

pinch.scale = 1;

}

旋转手势:UIRotationGestureRecognizer

- (void)rotationAction:(UIRotationGestureRecognizer *)rotate{

//获取手势关联的视图

UIImageView *imageView = (UIImageView *)rotate.view;

//改变imageView的形变属性

//1、发生回弹

//    imageView.transform = CGAffineTransformMakeRotation(rotate.rotation);

//2、不发生回弹

imageView.transform = CGAffineTransformRotate(imageView.transform, rotate.rotation);

//如果不设定,会发生累加

rotate.rotation = 0;

}

##DAY4 事件的基本概念、触摸的基本概念、响应者链、手势的更多相关文章

  1. Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件

    触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...

  2. 《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

    原创文章,欢迎转载.转载请注明:关东升的博客 应用与用户进行交互,依赖于各种各样的事件.事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成的.响应者链在事件处理 ...

  3. iOS 事件响应者链的学习(也有叫 UI连锁链)

    当发生事件响应的时候,必须知道由谁来响应事件.在iOS中,由响应链来对事件进行响应,所有的事件响应的类都是继承于UIResponder的子类,响应链是一个由不同对象组成的层次结构,其中每个对象将依次获 ...

  4. iOS 之 事件响应者链

    响应者链表示一系列的响应者对象.事件被交由第一个响应者对象处理,如果第一个响应者不处理,事件就沿着响应者链向上传递,交由下一个响应者(Next responder). View->ViewCon ...

  5. iOS事件传递和事件响应者链 20170810

    一.事件响应者链 事件传递和事件响应链 区别 事件的传递和响应的区别: 事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件. 引出 当我们手指触摸屏幕 ...

  6. iOS开发事件分发机制—响应链—手势影响

    1.提纲 什么是iOS的事件分发机制 ? 一个事件UIEvent又是如何响应的? 手势对于响应链有何影响? 2.事件分发机制 2.1.来源 以直接触摸事件为例: 当用户一个手指触摸屏幕是会生成一个UI ...

  7. iOS响应者链和事件传递机制

    原文来自:http://www.cnblogs.com/zhw511006/p/3517248.html 响应者链(Responder Chain) 通常,一个iOS应用中,在一块屏幕上通常有很多的U ...

  8. NET中级课--浅谈委托,事件,异步调用,回调等概念

    直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某 ...

  9. cocos creator 的scorllview 滑动事件和 子内容触摸事件会产生冲突

    1:问题描叙: UI上的 scorllview 的子元素需要拖动到游戏场景.所以子元素需要绑定触摸事件,scorllview 默认的事件处理方式就会和子元素的触摸事件冲突.2:解决方案: Scroll ...

随机推荐

  1. 如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)

    前段时间由于工作的关系,需要编写一个将数据插入到 Sql server 2012 的桌面软件. 由于之前使用的是MFC,偶然间接触到了Qt后,被它的简洁惊艳到了,于是便毅然而然的转投到了Qt的怀抱,哈 ...

  2. iphone/ipad前端开发技巧

    iPad开发的局限性 在iPad上使用Safari浏览普通网站网页的时候,网页因为太大而导致需要手动放大缩小或者滑动,虽然这种滑动行为在iPad上市之初的各种宣传中被津津乐道,但时间久了我们还是会发现 ...

  3. SSH框架——Sprign声明式事务

    Spring事务管理 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的 ...

  4. R包——ggplot2(一)

    关于ggplot2包(一) 关于ggplot2包(一) ggplot2基本要素 数据(Data)和映射(Mapping) 几何对象(Geometric) 标尺(Scale) 统计变换(Statisti ...

  5. SQL 简单练习

    USE study; SELECT * FROM EMP --查询雇员姓名的最后三个字母 ) FROM EMP ; --查询10部门雇员进入公司的星期数 --1 查询部门30中的所有员工 --2 列出 ...

  6. h5的api dom全屏展示

    下面是完整的例子,暂不做分析 <!DOCTYPE html> <html> <head> <title> FullScreen API 演示</t ...

  7. python使用mysql的三个模块:mysql.connector、sqlalchemy、MySQLdb

    在python中使用mysql其实很简单,只要先安装对应的模块即可,那么对应的模块都有什么?官方也没指定也没提供,pcat就推荐自己遇到的3个模块:mysql.connector.sqlalchemy ...

  8. 网络上USB后面跟AF或AM接口的意思

    AM to micro 5pin或AF to micro 5pin 这里的AM或AF是Type a male和Type a female的简写 Type a male:A型男士 Type a fema ...

  9. file_get_contents 超时设置

    <?php $ctx = stream_context_create( array( 'http' => array( 'timeout' => 1 //设置一个超时时间,单位为秒 ...

  10. zookeeper 伪集群模式

    问题二:开发没有足够机器,一台机子上是否装三个zookeeper服务器集群. 问题解答: 这种安装模式只能说是一种伪集群模式.三个zookeeper服务器都安装在同一个服务器(platform)上,需 ...