前段时间学习了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下搭建学习objective-c 的运行环境【转载】

    对于Iphone开发学习者而言,Object -c 是必修的语言.但是由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果iPhone等产品的应用程序, ...

  2. VS2012中数据库架构的比较

    在进行项目进行开发或维护时,经常会改动使用的数据库,或增加.修改字段,或加表,改存储过程等,而且会出现多个类似的数据库同时在用(比如过个类似的项目,要使用稍有不同的数据库),这个时候就可能需要进行数据 ...

  3. Scala 基础入门【翻译】

    原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变量 val.可变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果 ...

  4. 【LeetCode】257. Binary Tree Paths

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...

  5. FoLlow 的技术博客

    酷壳 http://coolshell.cn 老赵点滴- 追求编程之美 http://blog.zhaojie.me/ Pixel-In-Gene Blog

  6. leveldb - menifest文件格式

    MANIFEST文件是Level DB的元信息文件,它里面的格式是leveldb的Log格式,一个menifest是一个record: void VersionEdit::EncodeTo(std:: ...

  7. angularjs, nodejs, express, gulp, karma, jasmine 前端方案整合

    今年转向做前端开发,主要是做angularjs开发,期间接触了nodejs平台,从此一发不可收拾. npm丰富的插件库,express 开发框架, grunt, gulp构建工具,karma测试管理工 ...

  8. U3D包大小优化之microlib

    当迩想把最小类库发上来,迩需要把Stripping Level设置为Use micro mscorlib 这里是MICROLIB所能使用的包的类库列表:http://docs.unity3d.com/ ...

  9. oracle 11g 如何创建、修改、删除list-list组合分区

    Oracle11g在分区方面做了很大的提高,不但新增了4种复合分区类型,还增加了虚拟列分区.系统分区.INTERVAL分区等功能. 9i开始,Oracle就包括了2种复合分区,RANGE-HASH和R ...

  10. zmq 学习笔记

    0. PUB/SUB, XPUB/XSUB filtering happens at publisher sides when sockets are using a connected protoc ...