前段时间学习了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. windows批处理

    1.日期作为变量当做文件名的一部分. C:\Documents and Settings\Simon>echo %date%2008-09-09 星期二 C:\Documents and Set ...

  2. LeetCode:Container With Most Water,Trapping Rain Water

    Container With Most Water 题目链接 Given n non-negative integers a1, a2, ..., an, where each represents ...

  3. nginx+tomcat+java部署总结

    昨天部署了一下nginx+tomcat+java出现了很多问题,以下为整理总结. 使用了两种部署方式,一种是源码部署,一种是war部署. java源码部署总结: 环境:nginx+tomcat 部署方 ...

  4. SVO实时全局光照优化(里程碑MK0):Sparse Voxel Octree based Global Illumination (SVO GI)

    完全自主实现,bloat-free.再次声明,这不是UE.U3D.CE.KlayGE! 老规矩,先贴图.后面有时间再补充描述. 1. 支持多跳间接全局光照2. 支持vxao/so.vxdiff/spe ...

  5. RHEL 6 或者 Oracle Linux 6, 不关机识别新添加的scsi硬盘

    下面看一下在系统不重启的情况,如何让系统认识新的磁盘,并能对其分区与格式化1.在开机状态下新增磁盘2.执行下面的命令 echo "- - -" > /sys/class/sc ...

  6. ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT

    一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...

  7. Mac OS 下安装rar unrar命令

    环境 操作系统:Mac OS X 10.9.4 1. 下载 地址: http://www.rarlab.com/rar/rarosx-5.2.0.tar.gz 2. 安装 解压后进入目录 MacBoo ...

  8. 云服务器 ECS Linux 系统盘数据转移方法

    转自:https://help.aliyun.com/knowledge_detail/41400.html 问题描述 购买云服务器 ECS Linux 服务器时,未购买数据盘,使用一段时间后,随着业 ...

  9. 同步与异步&阻塞与非阻塞

    摘要 一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下,原来是这么个意思 一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下 一.同步与异步的区别 1.概念介绍 同步:所谓同步是一个服务的完成需要依 ...

  10. 像table一样布局div

    原文:http://www.456bereastreet.com/archive/200405/equal_height_boxes_with_css/ 下面是我翻译的内容,是根据我对文章的理解意译的 ...