iOS GestureRecognizer与UIResponde

2018-07-30  本文已影响66人  taosiyu

在iOS中UIView是继承于UIResponder的,而UIResponder是专门用来响应用户的操作处理各种事件的,包括触摸事件(Touch Events)、运动事件(Motion Events)、远程控制事件(Remote Control Events,如插入耳机调节音量触发的事件),而很多我们常用的类也继承于UIResponder(UIApplication、UIView、UIViewController).

而以下几个方法

@interface UIResponder : NSObject
- (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;

是响应触摸事件的方法,我们可以利用这几个方法自定义自己的手势。当然Apple也为我们提供了几个基础的封装的手势提供使用(了UIGestureRecognizer手势识别)

这里并不深入研究手势的响应和传递,而是研究下几个基础的手势和touchs的关系,这里主要利用这几个内置的手势方法:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];
[self addGestureRecognizer:tap];//点击

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];
[self addGestureRecognizer:pan];//平移,慢速移动

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];//滑动,快速移动
[self addGestureRecognizer:swipe];

UILongPressGestureRecognizer *longG = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent:)];//长按
[self addGestureRecognizer:longG];
屏幕快照 2018-07-30 上午9.19.35.png

蓝色部分就是需要添加手势的view,我们分别添加上述的手势进行测试,同时实现touchs触摸相关方法

屏幕快照 2018-07-30 上午9.39.21.png

首先是UITapGestureRecognizer的方法执行顺序

屏幕快照 2018-07-30 上午9.21.30.png

很容易理解,因为只是tap单击事件,所以在检测到begin touch时手势事件就开始响应,同时并不会有move动作

然后是UIPanGestureRecognizer

屏幕快照 2018-07-30 上午9.22.03.png

pan手势是检测move的,所以在touch move有响应时,pan手势也进行响应

UISwipeGestureRecognizer

屏幕快照 2018-07-30 上午9.23.14.png

UILongPressGestureRecognizer

屏幕快照 2018-07-30 上午9.23.34.png

通过以上测试表明系统内置的手势事件是对UIResponder touch事件的监测封装,通过不同的计算得出是否触发了某个手势,而根据不同的手势,触发的时机也不同。通过UIResponder,我们也可以自定义自己的手势,通过模拟系统手势很容易就能实现.

上一篇下一篇

猜你喜欢

热点阅读