文档章节

iphone开发 用户点击,触摸和手势识别 解析

jackyyang
 jackyyang
发布于 2012/07/16 15:38
字数 1051
阅读 778
收藏 1

用户对屏幕(人机交互)的所有操作都可称为事件。事件包括用户点击,触摸和手势识别等。

一:UIView及UIViewController都继承自UIResponder类,而具有在屏幕上显示功能的类及其控制器类(UIControl)也都继承自UIView,所以他们都时响应者(即所有视图和所由控件都是响应者)。

内容结构图:


二:响应着链:事件是向上传递的(这点类似于java中的异常处理:throw),当当前响应者处理不了事件的时,他会将此事件传递给他的父视图,逐级向更高一层(下一个对象)传递。

如果窗口处理不了当前事件,此事件将会被传递到应用程序的UIApplication实例。如果还是处理不了,此事件将进入睡眠状态。

响应者链图:


转发事件:从上面可以看到,事件是在逐个对象间的传递,当视图(如:表视图)不包含动作事件(如:轻扫手势)时,可能不会执行传递工作,这样其他对象将无法获得响应,阻止了其他视图的手势识别。这时就需要手动去传递:在下一个响应者上调用相同的方法来传递该对象,
[plain] view plain copy
  1. -(void)<span style="background-color: rgb(153, 255, 153);">responder</span>:(UIEvent*)event{  
  2. //如果可处理传递事件,执行此句:  
  3. [self handleEvent:event ];  
  4.   
  5. //否则手动传递到下一个响应者(递归)  
  6. [self.nextResponder <span style="background-color: rgb(153, 255, 153);">responder</span>:event ];  
  7. }  

三:  4个通知手势的方法:

1.开始触摸:
[plain] view plain copy
  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.     [super touchesMoved:touches withEvent:event];  
  3.     //touches :动作的数量()  每个对象都是一个UITouch对象,而每一个事件都可以理解为一个手指触摸。  
  4.     //获取任意一个触摸对象  
  5.     UITouch *touch = [touches anyObject];  
  6.     //获得触摸对象的点击数量,只捕捉一个触摸对象的点击。  
  7.     NSInteger numTaps=[touch tapCount];  
  8.     //获得触摸对象的数量  
  9.     NSInteger numTouchs=[touches count];  
  10.       
  11.     //触摸对象的位置  
  12.     CGPoint previousPoint = [touch previousLocationInView:self.view];  
2.移动:
[plain] view plain copy
  1. <pre name="code" class="plain">- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.    
  3. }</pre>  
  4. <pre></pre>  
  5. 3.离开:  
  6. <pre></pre>  

[plain] view plain copy
  1. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.    
  3. }  

4.取消:  电话呼入等中断手势时,会调用此方法。
[plain] view plain copy
  1. - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.    
  3. }  

四:手势识别器(UIGestureRecognizer):可以理解成一个容器,里面可添加它的子类(如:捏合(UIPinchGestureRecognizer),轻扫(UISwiperGestureRecognizer),点击(UITapGestureRecognizer)),这些子类都是封装好的,可响应屏幕上的事件进行处理。当然也可自定义手势识别器的子类,来响应需要的事件,这样显得更灵活些。

1.调用系统的手势识别器 以捏合为例:

[plain] view plain copy
  1. - (void)viewDidLoad {  
  2.     [super viewDidLoad];  
  3.     //实例化捏合手势识别器,将实例好的手势识别器对象作为实参传递到doPinch:。  
  4.     UIPinchGestureRecognizer *pinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(doPinch:)] autorelease];  
  5.     //将实例化捏合手势识别器加入视图识别器中。  
  6.     [self.view addGestureRecognizer:pinch];  
  7. }  
  8.   
  9. - (void)doPinch:(UIPinchGestureRecognizer *)pinch {  
  10.     //如果开始触发  
  11.     if (pinch.state == UIGestureRecognizerStateBegan) {  
  12.       CGFloat  initialFontSize = label.font.pointSize;  
  13.     } else {  
  14.         //按照捏合比例扩大或缩小  
  15.         label.font = [label.font fontWithSize:initialFontSize * pinch.scale];  
  16.     }  
  17. }  

2.自定义手势识别器:

自定义MyGestureRecognizerView。

MyGestureRecognizerView.h

[plain] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface MyGestureRecognizerView : UIGestureRecognizer  
  4.   
  5. @end  

MyGestureRecognizerView.m
[plain] view plain copy
  1. #import "MyGestureRecognizerView.h"  
  2.   
  3. @implementation MyGestureRecognizerView  
  4. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  5.     [super touchesBegan:touches withEvent:event];  
  6.       
  7.     //可以填写自己所需要的识别机制。。。。。。  
  8.       
  9.     //获取任意一个触摸对象  
  10.     UITouch *touch = [touches anyObject];  
  11.     //获得触摸对象的点击数量,只捕捉一个触摸对象的点击。  
  12.      NSInteger numTaps=[touch tapCount];  
  13.     //获得触摸对象的数量  
  14.      NSInteger numTouchs=[touches count];  
  15.       
  16.     //触摸对象的位置  
  17.     CGPoint previousPoint = [touch previousLocationInView:self.view];  
  18.       
  19.     }  
  20.   
  21. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  
  22.     [super touchesMoved:touches withEvent:event];  
  23.       
  24.    //可以填写自己所需要的识别机制。。。。。。。  
  25. }  
  26. @end  

在主视图控制器中:

HelloViewController.h
[plain] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface HelloViewController : UIViewController  
  4.   
  5. @end  

HelloViewController.m

[plain] view plain copy
  1. #import "HelloViewController.h"  
  2. #import "MyGestureRecognizerView.h"  
  3. @interface HelloViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation HelloViewController  
  8.   
  9. - (void)viewDidLoad  
  10. {  
  11.       
  12.     MyGestureRecognizerView *mygest=[[MyGestureRecognizerView alloc] initWithTarget:self action:@selector(doit:)];  
  13.       
  14.     [self.view addGestureRecognizer:mygest];  
  15.     [super viewDidLoad];  
  16.     // Do any additional setup after loading the view, typically from a nib.  
  17. }  
  18.   
  19. -(void)doit:(MyGestureRecognizerView *)my{  
  20.       
  21. }  
  22.   
  23. - (void)viewDidUnload  
  24. {  
  25.     [super viewDidUnload];  
  26.     // Release any retained subviews of the main view.  
  27. }  
  28.   
  29. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  30. {  
  31.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  32. }  
  33.   
  34. @end 

© 著作权归作者所有

共有 人打赏支持
jackyyang
粉丝 22
博文 42
码字总数 18506
作品 0
珠海
私信 提问
iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/47753217 -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强...

KenshinCui
2015/08/18
0
0
Weex 事件传递的那些事儿

前言 在前两篇文章里面分别谈了Weex如何在Native端初始化的和Weex是如何高效的渲染Native的原生UI的。Native这边还缺一块,那就是Native产生的一些事件,是怎么传回给JS的。这篇文章就详细分...

一缕殇流化隐半边冰霜
2017/04/16
0
0
iOS之[事件全解析]

iOS只有继承UIResponder类的对象才能处理事件。(UIView,UIViewController,UIApplication...) UIResponder中定义了上述几类事件 1.触摸事件 :fa-hand-o-down:一根或多根手指开始触摸屏幕时...

言筱羽
2015/12/03
237
0
前端知识 | React Native手势响应浅析

目前手机市场上,全面屏时代已经势不可挡,为了增大屏幕,一个个物理按键已渐渐消失在手机上。那么,手势将成为在移动应用开发中一个重要的组成部分,移动设备上手势识别要比 web 端复杂得多...

海说软件
2018/06/26
0
0
iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用

iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用 一、引言 在iOS系统中,手势是进行用户交互的重要方式,通过UIGestureRecognizer类,我们可以轻松的创建出各种手势应用于app...

珲少
2015/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【大数据分析常用算法】9、马尔科夫模型

简介 这一章节我们讲解马尔科夫模型。给定一组随机变量(如顾客最近的交易日期),马尔科夫模型只根据前一个状态(前一个最近交易日期)的分部指示该变量最近的分布。 1、马尔科夫链基本原理...

Areya
25分钟前
1
0
vue自定义属性

vue自定义属性如果是固定的非写死的,可以直接写,例如 <button vkshop-event-name="buyNow" vkshop-event-type="click"></button> 如果是动态属性,需要加冒号 : <button :vkshop-event-na......

litCabbage
28分钟前
0
0
Java 线程池的使用好处

使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 以下是Java自带的几种线程池: 1、newFixedT...

飓风2000
31分钟前
0
0
Ubuntu 16.04安装Java 8

1 Java 8 下载地址 http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html 2 以root用户登录将下载的jdk-8u92-linux-x64.tar.gz文件放到/temp目录下......

群星纪元
42分钟前
1
0
我们总结了每个技术团队都会遇到的 4 个难题

阿里巴巴 2019 年实习生校园招聘已经启动,为此,我们整理了一篇《每个技术团队都会遇到的4个难题》,帮助即将从校园进入公司实习的后端程序员,以实践的视角,看看一个后端技术团队会遇到的...

阿里云云栖社区
46分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部