获取手势点击哪个控件与手势一起动 UIGestureRecognizer

UITouch 和 手势
UIView除了负责展示内容给用户外还负责响应用户事件。本章主要介绍UIView用户交互相关的属性和方法。
1、交互相关的属性
userInteractionEnabled&默认是YES&,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除。也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件。
multipleTouchEnabled&&默认是NO,如果设置为YES则支持多点触碰。
exclusiveTouch&默认是NO,如果设置为YES则当前UIView会独占整个Touch事件。具体来说就是如果UIView设置了exclusiveTouch属性为YES则当这个UIView成为第一响应者时,在手指离开屏幕前其他view不会响应任何touch事件。
作用举例:UITableView的每个cell都需要使用exclusive,否则同时点击多个cell会触发每个视图的事件响应。手势识别会忽略此属性。
2、触摸响应
了解UIView的触碰响应之前,首先了解在iOS中触碰事件是什么,事件在视图模型中是如何传递的,视图在接收到一个事件是如何响应的。下面介绍触碰事件类UITouch和响应者链来解释事件的工作原理。
在iOS中UITouch类代表触碰事件。当用户触摸屏幕后就会产生相应的事件,所有相关的UITouch对象都被包装在事件中,被程序交由特定的对象处理。UITouch对象包括触碰的详细信息。
UITouch含有5个属性:
window:触碰产生时所处的窗口,由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口。
view:触碰产生时所处的视图。由于视图可能发生变化,当前视图也不一定是最初的视图。
tapCount:短时间内轻击(tap)屏幕的次数,可根据tapCount判断单击、双击或更多的轻击。
timestamp:时间戳记录了触碰事件产生或变化时的时间。单位是秒。
phase:触碰事件在屏幕上有一个周期,即触碰开始、触碰点移动、触碰结束,中途取消。通过phase可以查看当前触碰事件在一个周期中所处的状态。UITouchPhase枚举:
UITouchPhaseBegan
UITouchPhaseMoved
UITouchPhaseStationary
UITouchPhaseEnded
UITouchPhaseCancelled
当手指触碰到屏幕,无论是单点还是多点触碰,事件都会开始,直到用户所有的手指都离开屏幕。期间所有的UITouch对象都被封装在UIEvent事件对象中,由程序分发给处理者。事件记录了这个周期中所有触碰对象状态的变化。
只要屏幕被触摸,系统会将诺干个触碰信息封装到UIEvent对象中发送给程序,由管理程序UIApplication对象将事件分发。
响应者对象就是可以响应事件并对事件作出处理的对象。在iOS中UIResponder类定义了响应者对象的所有方法。UIApplication、UIWindow、UIViewController、UIView以及UIKit中继承自UIView的控件都间接或直接继承自UIResponder类,这些类都可以当做响应者。
响应者链表示一系列响应者对象组成的事件传递的链条。当确定了第一响应者后,事件交由第一响应者处理,如果第一响应者不处理事件沿着响应者链传递,交给下一个响应者。一般来说,第一响应者是UIView对象或者UIView的子类对象,当其被触摸后事件交由它处理,如果它不处理,事件就会交给它的UIViewController处理(如果存在),然后是它的superview父视图对象,以此类推,直到顶层视图。如果顶层视图不处理则交给UIWindow对象处理,再到UIApplication对象(如果UIApplication继承自UIResponder)。如果整个响应者链都不响应这个事件则该事件被丢弃。
UIView类继承了UIResponder类,要对事件作出处理还需要重写UIResponder类中定义的事件处理函数。根据不同的触碰状态,程序会调用相应的处理函数,这些函数包括:
-(void)&touchesBegan:(NSSet&*)touches&withEvents:(UIEvent&*)
-(void)&touchesMoved:(NSSet&*)touches&withEvents:(UIEvent&*)
-(void)&touchesEnded:(NSSet&*)touches&withEvents:(UIEvent&*)
-(void)&touchesCancelled:(NSSet&*)touches&withEvents:(UIEvent&*)
这几个方法被调用时,对应了UITouch类中的phase属性的4个枚举值。当触碰被取消,如触碰过程中被来电打断,会调用touchesCancelled:touches:方法。
这些方法在开发中并不需要全部实现,可以根据需要重写特定的方法。这4个方法都有两个相同的参数:NSSet类型的touches和UIEvent类型的event。Touches表示触碰产生的所有的UITouch对象,event表示事件。因为UIEvent包含了整个触碰过程中所有的触碰对象,所以可以调用allTouches&方法获取该事件内所有触碰对象,也可以调用touchesForV或者touchesForW取出特定视图或者窗口上的触碰对象。在这几个事件中,都可以拿到触碰对象,然后根据其位置、状态、时间属性做逻辑处理。
轻击操作很容易引起歧义,比如用户点击了一次之后,并不知道用户是想单击还是只是双击的一部分,或者点了两次之后并不知道用户是想双击还是继续点击。可以使用延迟调用函数解决这个问题。
除了触碰事件外UIResponder还提供了运动事件的支持。
运动事件的方法:
-(void)motionBegan:(UIEventSubtype)motion&withEvent:(UIEvent&*)event&摇动事件开始
-(void)motionEnded:(UIEventSubtype)motion&withEvent:(UIEvent&*)event&摇动事件结束
-(void)motionCancelled:(UIEventSubtype)motion&withEvent:(UIEvent&*)event&&摇动事件被中断
远程事件:
-(void)remoteControlReceivedWithEvent:&音乐后台播放控制的时候会用到
第一响应者的相关函数:
-&(BOOL)canBecomeFirstResponder&&&&默认返回NO
-&(BOOL)becomeFirstResponder
-&(BOOL)canResignFirstResponder&&&&默认返回YES
-&(BOOL)resignFirstR
-&(BOOL)isFirstResponder
可以通过becomeFirstResponder方法注册成为第一响应者,通过resignFirstResponder方法不成为第一响应者。比如通过这两个方法操作UITextField来控制键盘的现隐藏。
UIView关于手势的方法:
-(void)&addGestureRecognizer:(UIGestureRecognizer&*)gestureRecognizer&&增加一个手势。
-(void)&removeGestureRecognizer:(UIGestureRecognizer&*)getureRecognizer&删除一个手势。
-(BOOL)&gestureRecognizerShouldBegan:(UIGestureRecognizer&*)gestureRecognizer&询问是否开始执行该手势,默认返回YES。
手势相比触碰事件的好处是可以直接使用已经定义好的手势,开发者不用自己计算手指移动轨迹。
UIGestureRecognizer是一个手势基类,提供了简单的手势实现方式。衍生类如下:
UITabGestureRecognizer&&&&&&&&&轻击手势
UIPinchGestureRecognizer&&&&&&&捏合手势
UIRotationGestureRecognizer&&&&旋转手势
UISwipeGestureRecognizer&&轻扫手势
UIPanGestureRecognizer&拖拽手势
UILongPressGestrueRecognizer&长按手势
UIGestureRecognizer主要方法:
-(id)&initWithTarget:action:&初始化方法
-(void)addTarget:action: &&
-(void)removeTarget:action:&
主要属性:
UIGestureRecognizerState&state&手势识别当前状态
有以下几种情况:
UIGestureRecognizerStatePossibel,& 未识别状态
UIGestureRecognizerStateBegan,&&&& 手势开始
UIGestureRecognizerStateChanged,& 手势改变
UIGestureRecognizerStateEnded, 手势结束
UIGestureRecognizerStateFailured&手势失败,被其他事件中断。
UITabGestureRecognizer&&轻击手势任意手指任意次数的点击
numberOfTapsRequired&点击次数
numberOfTouchesRequired&手指个数&&
UIPinchGestureRecognizer&&捏合或者扩张手势
scale:初始值为1,两手指距离减少则scale不断变小;两个手指重合则变为0;
velocity:初始值为0,手指移动的相对速度,两手指距离减少为负数,速度越快数值越少;两手指距离变大为整数,速度越快数值越大。
UIRotationGestureRecognizer&旋转手势
rotation:初始值为0,两手指的旋转弧度,顺时针旋转为正数,逆时针旋转为负数。
velocity:初始值为0手指一动的相对速度,顺时针为正数越快值越大;逆时针为负越快越小。
UISwipGestureRecognizer&轻扫手势,一个手势只能指定一个方向,如果需要指定多个方向需要多个手势
numberOfTouchesRequired:&手指个数
direction:手势方向,如UISwipeGestureRecognizerDirectionRight 向右
UIPanGestureRecognizer:&&拖拽手势,相比轻扫手势,手指与屏幕的交互时间更长。
mininumNumberOfTouches:默认值为1,最少手指数量
maxnumNumberOfTouches:最大手指数量
UILongPressGestrueRecognizer:&长按手势。
numberOfTapsRequired:默认值为0,轻击的次数。
numberOfTouchesRequired:默认值是1,手指数量。
mininumPressDuration:默认值为0.5,单位是秒。
allowableMovement:默认值为10,单位是像素。
本分类共有文章1篇,更多信息详见
& 2012 - 2014 &
&All Rights Reserved. &UIScrollView子控件加UIPanGestureRecognizer拖动手势
编辑:www.fx114.net
本篇文章主要介绍了"UIScrollView子控件加UIPanGestureRecognizer拖动手势",主要涉及到UIScrollView子控件加UIPanGestureRecognizer拖动手势方面的内容,对于UIScrollView子控件加UIPanGestureRecognizer拖动手势感兴趣的同学可以参考一下。
问题描述:横向UIScrollView里面的子控件,我使用了UIPanGestureRecognizer来实现拖动,但是发现UIScrollView无法响应滚动事件,因为scroll里面布满了我放的控件,所以不能响应。如果先让scroll响应
[panGestureRecognizer requireGestureRecognizerToFail:sroll.panGestureRecognizer]//先处理scroll发现,我添加的手势又不响应了,因为sroll滚动每次都成功。
解决办法:后来在 栈溢出 问答平台找到了一个没有采纳的答案解决了问题,使用手势代理,通过
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer来解决
这个方法是用来处理多手势共存的,返回NO则响应一个手势,返回YES为同时响应,我的处理方法是,判断当前gestureRecognizer是否是panGestureRecognizer,然后判断方向,如果为上下方向则返回NO,则scroll不响应,否则都响应,问题完美解决。
当然拖动手势没法直接获取方向需要通过
CGPoint translation = [(UIPanGestureRecognizer*)gestureRecognizer translationInView:self];来获得,如果translation.y的绝对值大于translation.x的绝对值就可以看成是上下方向。
本文标题:
本页链接:Button上面添加一个手势UIGestureRecognizer
[问题点数:40分]
Button上面添加一个手势UIGestureRecognizer
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。ios各种手势,很有意思 - 三分钟热度 - ITeye技术网站
博客分类:
转自http://blog.csdn.net/likendsl/article/details/7554150 这哥们很厉害的
iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
但是这种方式甄别不同的手势操作实在是麻烦,需要你自己计算做不同的手势分辨。后来。。。
苹果就给出了一个比较简便的方式,就是使用UIGestureRecognizer。
二、UIGestureRecognizer
UIGestureRecognizer基类是一个抽象类,我们主要是使用它的子类(名字包含链接,可以点击跳到ios Developer library,看官方文档):
从名字上我们就能知道, Tap(点击)、Pinch(捏合)、Rotation(旋转)、Swipe(滑动,快速移动,是用于监测滑动的方向的)、Pan (拖移,慢速移动,是用于监测偏移的量的)以及 LongPress(长按)。
举个例子,可以在viewDidLoad函数里面添加:
-(void) viewDidLoad
[super viewDidLoad];
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[self.view addGestureRecognizer:panRecognizer];
panRecognizer.maximumNumberOfTouches = 1;
panRecognizer.delegate =
[panRecognizer release];
其它手势方法类似。
其核心就是设置delegate和在需要手势监测的view上使用addGestureRecognizer添加指定的手势监测。
当然要记得在作为delegate的view的头文件加上&UIGestureRecognizerDelegate&。
不过有些手势是关联的,怎么办呢?例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。
手势识别是具有互斥的原则的,比如单击和双击,如果它识别出一种手势,其后的手势将不被识别。所以对于关联手势,要做特殊处理以帮助程序甄别,应该把当前手势归结到哪一类手势里面。
比如,单击和双击并存时,如果不做处理,它就只能发送出单击的消息。为了能够识别出双击手势,就需要做一个特殊处理逻辑,即先判断手势是否是双击,在双击失效的情况下作为单击手势处理。使用
[A requireGestureRecognizerToFail:B]函数,它可以指定当A手势发生时,即便A已经滿足条件了,也不会立刻触发,会等到指定的手势B确定失败之后才触发。
- (void)viewDidLoad
UITapGestureRecognizer* singleR
singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(SingleTap:)];
singleTapRecognizer.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:singleRecognizer];
UITapGestureRecognizer* double;
doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(DoubleTap:)];
doubleTapRecognizer.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:doubleRecognizer];
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[singleRecognizer release];
[doubleRecognizer release];
-(void)SingleTap:(UITapGestureRecognizer*)recognizer
-(void)DoubleTap:(UITapGestureRecognizer*)recognizer
三、iphone操作手势的大概种类
1.点击(Tap)点击作为最常用手势,用于按下或选择一个控件或条目(类似于普通的鼠标点击)、
2.拖动(Drag)拖动用于实现一些页面的滚动,以及对控件的移动功能。
3.滑动(Flick)滑动用于实现页面的快速滚动和翻页的功能。
4.横扫(Swipe)横扫手势用于激活列表项的快捷操作菜单
5.双击(Double Tap)双击放大并居中显示图片,或恢复原大小(如果当前已经放大)。同时,双击能够激活针对文字编辑菜单。
6.放大(Pinch open)放大手势可以实现以下功能:打开订阅源,打开文章的详情。在照片查看的时候,放大手势也可实现放大图片的功能。
7.缩小(Pinch close)缩小手势,可以实现与放大手势相反且对应的功能的功能:关闭订阅源退出到首页,关闭文章退出至索引页。在照片查看的时候,缩小手势也可实现缩小图片的功能。
8.长按(Touch &Hold)在我的订阅页,长按订阅源将自动进入编辑模式,同时选中手指当前按下的订阅源。这时可直接拖动订阅源移动位置。针对文字长按,将出现放大镜辅助功能。松开后,则出现编辑菜单。针对图片长按,将出现编辑菜单。
9.摇晃(Shake)摇晃手势,将出现撤销与重做菜单。主要是针对用户文本输入的。
浏览 16523
jiangzhoubai
浏览: 32074 次
来自: 太原
求Service类的代码,
gamehiboy 写道Service类是啥, 插入数据的se ...
Service类是啥,
写道:-) 我也刚刚 ...
:-) 我也刚刚做过类似的东西,我是造数据,python 实现 ...}

我要回帖

更多关于 android 手势解锁控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信