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. Objective-C基础笔记(7)Foundation中的常用结构体

    一.NSRange NSRange的定义: typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; N ...

  2. Keil 编译环境之在线仿真调试问题

    一.问题现象: 这几天刚开始上手STM32,使用Keil 环境进行编程,然后使用ULINK2进行在线仿真,在按键处理函数程序中设置断点,却发现按了按键程序没有停在设置的断点,程序正常运行,如下图所示, ...

  3. Eclipse导入Maven项目出现错误:Unsupported IClasspathEntry kind=4

    使用Eclipse导入Maven项目失败,提示: An internal error occurred during: "Importing Maven projects". Un ...

  4. 【MongoDB】The connection between two tables

    In mongoDB, there are two general way to connect with two tables. Manual Connection and use DBRef 1. ...

  5. python 命令行參数解析

    本文是从我还有一个博客转载过来的,欢迎大家点击进去看一下,帮我添加点人气^_^ ImPyy 选择模块 依据python參考手冊的提示,optparse 已经废弃,应使用 argparse 教程 概念 ...

  6. Bitmap-把方形图片处理为圆形

    这个是直接在网上转载的,自己验证可靠 转载自http://my.oschina.net/zhouz/blog/213164 直接贴上代码 import android.graphics.Bitmap; ...

  7. TeamViewer的下载、安装和使用(windows7、CentOS6.5和Ubuntu14.04(64bit))(图文详解)

    不多说,直接上干货! TeamViewr是远程支持.远程访问.在线协作和会议软件. 分为从windows7.CentOS6.5和Ubuntu14.04(64bit) 系统来详解下载.安装和初步使用! ...

  8. web service 原理

    Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...

  9. ajax实现简单的点击左侧菜单,右侧加载不同网页

    实现:ajax实现点击左侧菜单,右侧加载不同网页(在整个页面无刷新的情况下实现右侧局部刷新,用到ajax注意需要在服务器环境下运行,从HBuilder自带的服务器中打开浏览效果即可) 原理:ajax的 ...

  10. [Angular & Web] Retrieve user data from Session

    Once user sign up, we store the user data inside cookie in the broswer and also keep a memory copy i ...