前段时间学习了IOS基础的一些控件的使用作为基础,现在开始学习一些高级编程的东西,手势处理器、文件I/O、定位、网络通信、多线程这些,分享一些学习的重点,还是很实用的。

今天就先介绍个简单点得,手势处理器:

一、首先,应该清楚ios事件相应的顺序,即响应者链。

只要继承了UIResponder的对象就可以作为响应者,实际上UIControl:UIView:UIResponder,由此可见,所有的对象都可以作为事件的相应者。

当用户与某个控件交互时,该控件将作为第一响应者(First Responder),第一响应者将作为响应链的开始,事件最先由控件本身处理,如果控件自身不处理,事件就会被传播到它对应的控制器(如果存在);如果视图控制器不处理,再向上传播到父控件,父控件不处理再传播到父控件的控制器,直到顶层视图对应的视图控制器。

如果事件从第一响应者到顶层视图的控制器都没有被处理,将会传播的应用程序窗口(UIWindow也继承了UIView),如果还不处理将会传播到UIApplication(:UIResponder),不处理会传播到应用程序的委托类中。

First Responder =》 First Responder的视图控制器(如果有) =》 父容器(如果有)=》父容器的视图控制器(如果有) =》 UIWindow =》 UIApplication =》 应用程序委托对象

如果在上面的流程中事件都没有被处理,那么事件就会被丢弃。一般来说,如果某一个环节处理了事件,那么事件就会停止传播;但是可以手动将事件继续向上传播。手动传递事件的方法:

-(void) handleTapEvent:(UIEvent *) event
{
if(condition)
{
//处理事件
}
else
{
[self.nextResponder handleTapEvent:event];//手动传递事件
}
}

(上面的流程有点类似于js的事件冒泡)

二、相应触碰的方法

如果希望在自定义控件中相应用户的触碰事件,则可以通过UIResponder的如下4个方法完成

- touchesBegan:(NSSet *)touches withEvent(UIEvent *) event:     当用户手指开始接触控件或窗口事件时激发

- touchesMoved:(NSSet *)touches withEvent(UIEvent *) event:     当用户手指在控件上移动时激发

- touchesEnded:(NSSet *)touches withEvent(UIEvent *) event:     当用户手指结束接触控件或窗口事件时激发

- touchesCancelled:(NSSet *)touches withEvent(UIEvent *) event:     当系统事件(比如内存低事件)终止了触碰事件时激发

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSInteger fingersNum = [touches count];
NSInteger tapCount = [[touches anyObject] tapCount];
NSLog(@"有%ld根手指点击了屏幕", (long)fingersNum);
NSLog(@"手指点击了屏幕%ld次", (long)tapCount);
}

UITouch对象代表一个触碰事件,touches即多个UITouch对象的集合,UITouch还提供了locationInView方法来获取该触碰事件在UIView控件中得触碰位置。

三、使用手势处理器(UIGestureRecognizer)

通过手势处理器处理手势将变得非常简单,无论处理那种手势,都可以面向UIGestureRecognizer编程,UIGestureRecognizer提供了下面几个子类:

UITapGestureRecognizer:处理用户点击手势

UIPinchGestureRecognizer:处理捏合手势

UIRotationGestureRecognizer:处理旋转手势

UISwipeGestureRecognizer:处理滑动手势

UIPanGestureRecognizer:处理拖动手势

UILongPressGestureRecognizer:处理长按手势

上面这几个类提供了IOS中几乎所有的手势处理。

使用手势处理器的步骤如下:

1、根据需要添加相应的手势处理器,指定处理器的target和action对象

2、如果该控件不允许用户交互,则将userInteractionEnabled设置为YES

3、调用UI控件的addGestureRecognizer方法添加手势处理器

UIGestureRecognizer提供了下面的常用方法和属性

locationInView:(UIView *) view    手势在view中的触碰位置

locationOfTouch:(NSInteger )touchIndex inView(UIView *) view    返回该手势中第touchindex个触碰点在view中得位置

numberOfTouches  触碰点得个数,即几个手指点击了屏幕

view 返回出发该手势的控件

enabled:用于设置和返回手势处理器是否可用

state:获取手势所处状态

下面使用UITapGestureRecognizer来处理点击手势,UIPinchGestureRecognizer处理捏合手势

1、实用storyboard设计界面,在界面拖入一个label和一个空得view,在view上绑定点击手势处理器,然后在label上显示我们对view做了些什么

#import <UIKit/UIKit.h>

@interface TapEventSimpleController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *lblText;
@property (weak, nonatomic) IBOutlet UIView *viewContent; @end
import "TapEventSimpleController.h"

@implementation TapEventSimpleController

-(void)viewDidLoad
{
[super viewDidLoad];
//设置可以用户交互
self.viewContent.userInteractionEnabled = YES;
//设置支持多点触碰
self.viewContent.multipleTouchEnabled = YES;
for (int i = 1; i < 6; i++) {
//创建手势处理器,制定该控制器的handleTap方法处理手势
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
//设置处理器只处理i次连击事件
gesture.numberOfTapsRequired = i;
gesture.numberOfTouchesRequired = 2;//只处理2个手指的点击事件
[self.viewContent addGestureRecognizer:gesture];
}
//创建捏合手势处理器
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
    [self.viewContent addGestureRecognizer:pinchGesture];
} //tap处理方法
-(void)handleTap:(UITapGestureRecognizer *)gesture
{
//获取点击的手指
NSInteger touchNum = gesture.numberOfTouches;
//获取点击的次数
NSInteger tapNum = gesture.numberOfTapsRequired; self.lblText.text = [NSString stringWithFormat:@"用户用%ld根手指点击了红色背景,点了%ld下",(long)touchNum,(long)tapNum];
//2秒后清除文本
//[self.lblText performSelector:@selector(setText:) withObject:nil afterDelay:2];
}
//处理pinch方法
-(void)handlePinch:(UIPinchGestureRecognizer *) pinchGesture
{//获取捏合的速度
CGFloat velocity = pinchGesture.velocity;
CGFloat scale = pinchGesture.scale;
self.lblPinchText.text = [NSString stringWithFormat:@"用户捏合的速度是:%g,捏合比例是%g",velocity,scale];
}

运行效果:

其他的几个手势处理器找时间再补充吧。

 
 
 
 
 

IOS高级编程之一:多点触摸与手势验证的更多相关文章

  1. Flex中处理多点触摸和手势

    在Flex中多点触摸和手势都需要利用Multitiouch类来完成:1.supportsGestureEvents:判断是否支持手势2.supportsTouchEvents:判断是否支持多点触摸可以 ...

  2. IOS高级编程之三:IOS 多线程编程

    多线程的概念在各个操作系统上都会接触到,windows.Linux.mac os等等这些常用的操作系统,都支持多线程的概念. 当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的. 例如: ...

  3. iOS开发-轻点、触摸和手势

    一.响应者链 以UIResponder作为超类的任何类都是响应者.UIView和UIControl是UIReponder的子类,因此所有视图和所有控件都是响应者. 初始相应器事件首先会传递给UIApp ...

  4. Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件

    触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...

  5. iOS之触摸及手势

    触摸事件 iOS中的事件: 在用户使用app过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型:    view的触摸事件处理: 响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了 ...

  6. WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序

    原文:WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序 前面我讲了在win7下使用模拟器,进行调试模拟多点触摸,其实际开发中这样也比较麻烦.. 要拿几个鼠标. 所以更多的人会 买个触摸套 套 ...

  7. IOS 手势-轻点、触摸、手势、事件

    1.概念 手势是从你用一个或多个手指接触屏幕时开始,直到手指离开屏幕为止所发生的所有事件.无论手势持续多长时间,只要一个或多个手指仍在屏幕上,这个手势就存在. 触摸是指把手指放到IOS设备的屏幕上,从 ...

  8. 毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库

    毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库 在线演示地址: http://m.yunxunmi.com/ 支持 IOS Android Ipad 等不同操作系统的手持或 ...

  9. Objective-C 高级编程:iOS与OS X多线程和内存管理

    <Objective-C 高级编程:iOS与OS X多线程和内存管理> 基本信息 原书名: Pro Multithreading and Memory Management for iOS ...

随机推荐

  1. Asp.Net customErrors与httpErrors的区别

    先看一下简单的对比 customErrors Asp.Net级别的错误处理程序,只处理Asp.Net应用抛出的异常(404,403,500..) 在IIS7+的服务器依然可用(IIS7之前就引进了) ...

  2. Windows8和CentOS6.4(64)双系统硬盘安装(图文)【转】

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://asange.blog.51cto.com/7125040/1193980 最近在 ...

  3. Android使用的设计模式2——策略模式

    今天讲解一下策略模式,策略模式也是很常用的设计模式,对多种算法或者数据结构选择使用的情况下,经常会使用策略模式来管理这些算法.下面会简单讲解一下策略模式的概念和基本实现.然后结合Android里面的实 ...

  4. Scala 深入浅出实战经典 第39讲:ListBuffer、ArrayBuffer、Queue、Stack操作代码实战

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战

     Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 3 ...

  6. 对于程序开发者看书(指实在的书而不是PDF)的好处。(个人看法而已)

    书是实在的东西.不同PDF.他能带你进入一种学习态度的环境 书上已经所列了知识点.看了.那些知识点就是你的. 第一次看,未必完全理解到里面的东西.说不定过几天,几周,几个月,甚至几年.再看.就有可能看 ...

  7. IPv6 app适配

    参考资料: https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/Network ...

  8. DB2中OLAP函数使用示例

      下面的需求是将不仅获取查询的结果集,还要将结果集的SIZE返回.结果集的SIZE是无法通过CURSOR获取的.   通常聚合函数在二种情况下,使用默认分组即没有分组.可以直接使用,比如 selec ...

  9. 学习之路三十六:SQL知识总结 - [游标||字符串分割]

    好久没有写文章了,今天把前不久项目用到的SQL知识总结一下. 一丶字符串分割 SQL内置函数中是没有Split分割函数的,所以需要自己去实现,不多说,上代码: )) RETURNS @result T ...

  10. [转]silverlight Datagrid 行上增加ToolTip

    有两种办法: 1. 直接在后台处理在数据绑定后 ,注册LoadingRow 事件this.DataGrid.LoadingRow += new EventHandler<DataGridRowE ...