1.ios当中常⽤的事件?  触摸事件 ,加速计事件 ,远程控制事件

2.什么是响应者对象? 继承了UIResponds的对象我们称它为响应者对象 UIApplication、UIViewController、UIView都继承⾃自UIResponder 因此它们都是响应者对象,都能够接收并处理事件

3.为什么说继承了UIResponder就能够处理事件? 因为UIResponder内部提供了以下⽅方法来处理事件 ⽐比如

触摸事件会调⽤用以下⽅方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

加速计事件会调⽤用:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
远程控制事件会调⽤用:
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

4.如何监听UIView的触摸事件?
想要监听UIViiew的触摸事件,⾸首先第⼀一步要⾃自定义UIView,
因为只有实现了UIResponder的事件⽅方法才能够监听事件.

UIView的触摸事件主要有:

⼀一根或者多根⼿手指开始触摸view,系统会⾃自动调⽤用view的下⾯面⽅方法.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

⼀一根或者多根⼿手指在view上移动时,系统会⾃自动调⽤用view的下⾯面⽅方法
(随着⼿手指的移动,会持续调⽤用该⽅方法,也就是说这个⽅方法会调⽤用很多次)

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

⼀一根或者多根⼿手指离开view,系统会⾃自动调⽤用view的下⾯面⽅方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

⼀一当突然发生系统事件的时候,例如突然来了系统电话,或是手机没电的时候,系统就会自动调用

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

参数说明:

touches:

touches中存放的都是UITouch对象,它是一个NSSet集合.NSSet和NSArray一样同样属于集合,但是NSSet是无序的,NSArray是有序的,有序的就可以通过index将对象从集合中取出

UITouch对象它就是用来保存手指相关联的信息.包括位置,时间,阶段等信息.

每一个手指对应着一个UITouch对象.

这个UITouch是系统自动帮我们创建的,当手指移动时,系统会更新同一个UITouch对象,

使它能够一直保存该手指在的触摸位置

通过获取UITouch属性,我们可以获得触摸产生时所处的窗口,触摸的View,时间,点击的次数等,

这些都可以在通过UITouch获取.

UITouch方法:

@property(nonatomic,readonly) NSTimeInterval      timestamp;//获取点击的时间

@property(nonatomic,readonly) UITouchPhase        phase;//点击的状态

@property(nonatomic,readonly) NSUInteger          tapCount;   //点击的次数

@property(nullable,nonatomic,readonly,strong) UIWindow  *window;//点击的所在的window

@property(nullable,nonatomic,readonly,strong) UIView *view;//点击所在的view

event:

还可以通过UITouch提供的方法获取当前手指所在的点,以及上一个手指所在的点.

取当前手指所在的点

- (CGPoint)locationInView:(UIView *)view;

获取上一个触摸点的位置.

- (CGPoint)previousLocationInView:(UIView *)view;

每产生一个事件,就会产生一个UIEvent对象

UIEvent:称为事件对象,记录事件产生的时刻和类型

一次完整的触摸过程,会经历3个状态:

触摸开始:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

触摸移动:- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

触摸结束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

触摸取消(可能会经历):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数

如果两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象

如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,

并且每次调用时的touches参数中只包含一个UITouch对象

5. UIView拖拽思路?
1.⾃自定义UIView,实现监听⽅方法.
2.确定在TouchMove⽅方法当中进⾏行操作,因为⽤用户⼿手指在视图上移动的时候才需要移动视
图。
3.获取当前⼿手指的位置和上⼀一个⼿手指的位置.
4.当前视图的位置 = 上⼀一次视图的位置 - ⼿手指的偏移量

实现关键代码:
当⼿手指在屏幕上移动时调⽤用持续调⽤用
NSSet:⾥里⾯面的元素都是⽆无序的.
NSArray:⾥里⾯面的有顺序的.
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent
*)event{

1.获取⼿手指的对象
UITouch *touch = [touches anyObject];

2.获取当前⼿手指所在的点.
CGPoint curP = [touch locationInView:self];
3.获取⼿手指的上⼀一个点.

CGPoint preP = [touch previousLocationInView:self];
X轴⽅方向偏移量

CGFloat offsetX = curP.x - preP.x;
Y轴⽅方向偏移量

CGFloat offsetY = curP.y - preP.y;
CGAffineTransformMakeTranslation:会清空上⼀一次的形变.
self.transform = CGAffineTransformMakeTranslation(offsetX,

0);

self.transform = CGAffineTransformTranslate(self.transform,
offsetX, offsetY);

}

#import "RedView.h"

@implementation RedView

//当开始触摸屏幕的时候调用
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
} //触摸时开始移动时调用(移动时会持续调用) /* 1:touches.allObjects:获得所有的触摸的手指UITouch对象:当只有一根手指触摸屏幕就会产生一个UITouch对象,一个UITouch对象通过[touches anyObject]获得
2: CGPoint curP = [touch locationInView:self];
CGPoint preP = [touch previousLocationInView:self];
3:要累加形变:所以用CGAffineTransformTranslate(self.transform, offsetX, offsetY),初始状态self.transform为0
*/
//NSSet:无序
//NSArray:有序
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //做UIView拖拽
UITouch *touch = [touches anyObject]; //求偏移量 = 手指当前点的X - 手指上一个点的X
CGPoint curP = [touch locationInView:self];
CGPoint preP = [touch previousLocationInView:self];
NSLog(@"curP====%@",NSStringFromCGPoint(curP));
NSLog(@"preP====%@",NSStringFromCGPoint(preP)); CGFloat offsetX = curP.x - preP.x;
CGFloat offsetY = curP.y - preP.y; //平移
self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY); } //当手指离开屏幕时调用
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
} //当发生系统事件时就会调用该方法(电话打入,自动关机)
-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
} @end

ios开发事件处理之:一:UIView的拖拽的更多相关文章

  1. iOS开发拓展篇—xib中关于拖拽手势的潜在错误

    iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...

  2. iOS开发小技巧--cell往左拖拽出现很多按钮的实现,仅仅适用于iOS8以后

    // 往左拖拽cell出现多个按钮的实现,仅仅适用于iOS_8.0以后 - (NSArray<UITableViewRowAction *> *)tableView:(UITableVie ...

  3. 移动端H5混合开发,Touch触控,拖拽,长按, 滑屏 实现方案

    概述 近期由于产品快速原型开发的需要,不想用原声的方式开发App两端一起搞时间来不及,目前产品处于大量上feature的阶段,采用混合开发是最合适的选择,所以花了3天的时间研究怎么去实现移动端,拖拽, ...

  4. YAPI windows 二次开发 树形结构 多层级结构 拖拽 数据导入 接口自动化测试

    什么是YAPI: 高效.易用.功能强大的API管理平台 http://yapi.demo.qunar.com/ github: https://github.com/YMFE/yapi 可以去那里下载 ...

  5. 快速开发 HTML5 WebGL 的 3D 斜面拖拽生成模型

    前言 3D 场景中的面不只有水平面这一个,空间是由无数个面组成的,所以我们有可能会在任意一个面上放置物体,而空间中的面如何确定呢?我们知道,空间中的面可以由一个点和一条法线组成.这个 Demo 左侧为 ...

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

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

  7. iOS开发~视图(UIView)与控件(UIControl)

    1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...

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

    1:事件的产生与传递: 2:寻找最合适的view:如何查找最合适的view:需要三步:1:先判断自身是否能接受触摸事件 2:判断触摸点是否在自己身上 3:若前两条都满足,则其会从后往前遍历所有子控件( ...

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

随机推荐

  1. Java学习笔记三.2

    5.继承 //Java中所有对象都显式/隐式的继承子Object类 class fu{ fu(){ System.out.println("fu..."+getNum()); sh ...

  2. BZOJ2160: 拉拉队排练(Manacher)

    Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...

  3. 洛谷——P3819 松江1843路

    https://www.luogu.org/problem/show?pid=3819 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方 ...

  4. CODEVS——T1332 上白泽慧音 || 洛谷——P1726 上白泽慧音

    http://codevs.cn/problem/1332/|| https://www.luogu.org/problem/show?pid=1726#sub  时间限制: 1 s  空间限制: 1 ...

  5. (转)oracle 启动监听 报“监听程序不支持服务” 解决

    转自 http://www.51testing.com/html/99/478599-842622.html 今天安装了oracle后,启动监听,报错如下:    启动tnslsnr: 请稍候... ...

  6. Web应用开发(Servlet+html+Mysql)入门小示例

    在安装好eclipse并配置完安装环境.安装好tomcat的前提下: 1.新建Dynamic Web Project,选择好运行的tomcat服务器版本等:2.在WebContent下:   新建fo ...

  7. docker中发布springboot

    http://note.youdao.com/noteshare?id=81a603b1b33731aaef7b7755c70f33fb

  8. OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言

    友情提示 本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合. 本文中的代码注释比较多,不再过多解释. 更多用法,还是得看JDK的API或者看原文http://developer ...

  9. (素材源代码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI

    猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...

  10. PL/SQL笔记(一)

    PL/SQL概述 PL/SQL是一种高级的数据库程序设计语言,专门使用与Oracle语言基于数据库的服务器的内部,所以PL/SQL代码可以对数据库进行快速的处理. 1.什么是PL/SQL? PL/SQ ...