IOS手势总结与UIResponder

原创 2013年12月04日 11:08:27

手势与UITouch的区别:

手势继承自UIGestureRecognizer-->NSObject。

而UITouch直接继承自NSObject。


事实上,手势和UITouch本身关系不大,在IOS3.2之前根本没有手势,以前的所有操作都依赖于UITouch,这也是为什么UITouch定义在UIRsponder中的原因之一,并且所有的UIResponder及其子类都自带监听UITouch的方法。


手势的分类:

一般来说,我们用到的UIGestureRecognizer的子类有以下几种:

1:UITapGestureRecognizer

这个手势也就是常见的点击手势,可以通过设置numberOfTapsRequired来设定需要连续多少次点击才会触发事件。

需要注意的是:

如果在一个view上面同时既要触发单击又要触发双击,这样的情况下直接将两个手势加在这个view上面会导致触发双击事件的时刻,单击事件也会被触发。我们需要设置这样一个属性,来让系统一次只触发双击或者单击事件。

[doubleTap requireGestureRecognizerToFail:tap];

这个方法也可以用于对其它手势的互斥。

numberOfTouchesRequired可以用来设置手势需要多少手指。

2:UIPinchGestureRecognizer

放大缩放手势(放大过程中不断触发)。

需要注意的是,通过pinch.scale得到的数值是相对于原图的缩放比例,所以需要成员变量保存。

pinch.velocity可以得到手势的速率。


3:UIPanGestureRecognizer

拖动手势(拖动过程中不断触发)。

通过[pan translationInView:]返回一个CGpoint,这个Point的内容代表的就是当前鼠标相对于刚开始(按下的位置)的相对坐标。

通过[pan locationInView:self.view]可以得到当前鼠标相对于self.View的相对坐标。(同理可得到其它坐标系下坐标)


4:UILongPressGestureRecognizer

长按手势。

numberOfTapsRequired:长按之前需要先tap几下。

numberOfTouchesRequired:需要几个手指。

minimumPressDuration:最小持续长按时间。

注意:长按事件的监听不像点击事件一样只触发一次,也不像拖动事件一样会不断的触发,这个时间会被触发两次,分别是在长按生效的时刻触发一次,和松开手指的时刻触发一次。可以通过state,进行不同处理。

5:UISwipeGestureRecognizer

轻滑手势,也就是cell中的滑动删除手势。

numberOfTouchesRequired需要几个手指。

@property(nonatomic)UISwipeGestureRecognizerDirection direction; 

设置想要监听轻滑的方向。

6:UIRotationGestureRecognizer

旋转手势(持续触发)。

这个手势与pinch类似。两个属性rotation和velocity。


关于父类UIGestureRecognizer:

UIGestureRecognizer是所有手势的根类,所以,它的很多方法都是在手势中能够使用的。


首先是当前手势的状态:

UIGestureRecognizerState。

一般情况下,通过判断这个状态来区分手势在什么阶段。

@property(nonatomic,readonly)UIView *view;   

所有手势都可以通过这个属性获得当前响应手势的view。


可以为所有手势再添加一个触发事件,当这个手势被触发的时刻,原有处理方法触发后马上出发这个方法。(也可以先用init初始化,再添加这个事件监听)。

addTarget:selfaction:@selector()


delaysTouchesBegan属性会将当前的手势级别提升,也就是说,优先响应这个手势,只有这个手势失败后才会触发其他手势。


delaysTouchesEnded同理,只有这个手势失败后,才结束整个手势识别过程。


- (CGPoint)locationInView:(UIView*)view;    所有手势其实都可以得到自己的坐标。


- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view;某个手指的点击的位置(手势开始的时刻的位置))。


------------------如果需要对手势事件响应进行自定义就要用到代理了-------------------------

UIGestureRecognizerDelegate

这个代理包含三个回调方法。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;



UITouch:(包含点击次数和时间等属性。)

参考:http://justcoding.iteye.com/blog/1473287

UITouch的监听方法直接定义在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;


UIResponder:

利用这个类可以实现对touch事件的监听和对设备自身运动motion的监听。


还支持远程事件。

- (void)remoteControlReceivedWithEvent:(UIEvent *)event


参考文章:

http://blog.csdn.net/maojudong/article/details/7798138


关于firstResponder:(UIResponder默认为不能成为第一响应者的,子类覆写canBecomeFirstResponder方法来改变它)

3. 输入视图管理相关:

       输入视图是指当对象为 firstResponder 对象时,需要借助另外一个视图用来处理当前对象的信息输入,如 UITextView  UITextField 两个对象,在 UITextField 成为 firstResponder 对象时,会显示一个系统键盘,用来输入信息。这个键盘视图就是一个输入视图了。一共有两个相关的输入视图,一个是 inputView, 另一个是 inputAccessoryView,这两个视图显示的关系如下图:

 

 从图中可以看到, 如果 inputView  inputAccessoryView 两个属性都指定了相应的视图,则 inputAccessoryView 对象显示在 inputView 对象的上面

       与输入相关的还有一个 reloadInputViews 方法用来重新载入输入视图。


如何获取一个view所属的viewController:

通过superView是无法得到viewController的。

UIResponder* nextResponder = [view nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {

      return (UIViewController*)nextResponder;
}

为何可以通过responder获取所属viewController而不是获得的父视图view这与ios中响应者链的事件传递顺序有关

-------

响应链的过程:

事实上,在内存中,所有继承自uiresponder的对象会依赖其层级关系形成一棵n叉数,而事件就是回溯传递的。所以如果一个view不是viewcontroller中的view,那么它的nextresponder一般就是它的父容器。



版权声明:本文为博主原创文章,未经博主允许不得转载。

App状态管理-AppDelegate

AppDelegate的 前面提到UIApplicationMain函数会调用
  • sunyonggao
  • sunyonggao
  • 2014年08月14日 13:08
  • 691

ios 七种手势详解

//ios 七种手势简单总结 {     //创建imageView     UIImage *image = [UIImage imageNamed:@"01.jpeg"];     U...
  • liubaoheng
  • liubaoheng
  • 2017年02月17日 09:19
  • 1181

iOS 拖动手势

iOS 手势中还包含了一种--拖动 上节我们简单介绍了旋转手势:http://blog.csdn.net/lwjok2007/article/details/50835884 这节 我们简单介绍一...
  • lwjok2007
  • lwjok2007
  • 2016年03月09日 17:16
  • 3022

IOS 开发 手势 及事件传递机理

iOS手势是ios开发不可或缺的一部分,但对于ios的手势及事件相应机理大家并不知道,所以今天给大家讲一讲ios的事件相应机理 首先,ios的事件传递是依靠“事件链”传递的,当传递到链的某一个链环上...
  • m372897500
  • m372897500
  • 2016年05月21日 12:11
  • 983

iOS手势识别:识别原理和自定义手势识别

1,手势识别器简介在iOS中由于手势识别器的存在,我们可以非常容易的识别出用户的交互手势。 系统提供的手势识别器如下: UITapGestureRecognizer (点一下) UIPinchGest...
  • hejunmeng
  • hejunmeng
  • 2016年05月11日 22:58
  • 1464

【iOS开发-手势】iOS中各种手势总结

iOS中支持的手势事件 UITapGestureRecognizer(敲击) UIPinchGestureRecognizer(捏合,用于缩放) UIPanGestureRecognizer(拖拽)...
  • ttf1993
  • ttf1993
  • 2015年05月19日 17:27
  • 1146

IOS添加滑动手势

使用手势很简单,分为三步: 1 创建手势识别器对象实例。创建时,指定一个回调方法,当手势开始,改变、或结束时,执行回调方法。 2 设置手势识别器对象实例的相关属性(可选部分...
  • lgx_admin
  • lgx_admin
  • 2016年03月22日 14:11
  • 516

iOS开发中多手势冲突解决方案

iOS开发中多手势冲突解决方案iOS开发中我们经常会使用到手势,合理的运用手势会使我们的app拥有更好的体验,但是在使用手势的同时也要注意避免手势和手势间,以及手势和其他控件间的冲突。本文就主要介绍在...
  • wlaizff
  • wlaizff
  • 2016年09月07日 17:25
  • 4063

IOS的一些手势方法(手势的tag值 绝对值 偏移量 中心点 等等)

首先在手势的使用中 经常涉及到图片坐标的变化  有时候需要判断的时候就需要绝对值 绝对值: int abs(int i) 返回整型参数i的绝对值  double cabs(struct complex...
  • HY_BuJianChangAn
  • HY_BuJianChangAn
  • 2015年12月02日 20:17
  • 1155

iOS 心得十 按钮添加长按手势

前言 今天工作中遇到一个效果,平常我们也是很经常使用的,就是长按一个按钮做一个变换,或者是隐藏显示,或者是变色之类的,方法都是一样的。我采用的长按手势写的,分享出来。 链接 这是 Demo 的链接,...
  • github_30943901
  • github_30943901
  • 2015年11月11日 15:49
  • 4006
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS手势总结与UIResponder
举报原因:
原因补充:

(最多只允许输入30个字)