IOS高级编程之一:多点触摸与手势验证
前段时间学习了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高级编程之一:多点触摸与手势验证的更多相关文章
- Flex中处理多点触摸和手势
在Flex中多点触摸和手势都需要利用Multitiouch类来完成:1.supportsGestureEvents:判断是否支持手势2.supportsTouchEvents:判断是否支持多点触摸可以 ...
- IOS高级编程之三:IOS 多线程编程
多线程的概念在各个操作系统上都会接触到,windows.Linux.mac os等等这些常用的操作系统,都支持多线程的概念. 当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的. 例如: ...
- iOS开发-轻点、触摸和手势
一.响应者链 以UIResponder作为超类的任何类都是响应者.UIView和UIControl是UIReponder的子类,因此所有视图和所有控件都是响应者. 初始相应器事件首先会传递给UIApp ...
- Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件
触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...
- iOS之触摸及手势
触摸事件 iOS中的事件: 在用户使用app过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: view的触摸事件处理: 响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了 ...
- WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序
原文:WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序 前面我讲了在win7下使用模拟器,进行调试模拟多点触摸,其实际开发中这样也比较麻烦.. 要拿几个鼠标. 所以更多的人会 买个触摸套 套 ...
- IOS 手势-轻点、触摸、手势、事件
1.概念 手势是从你用一个或多个手指接触屏幕时开始,直到手指离开屏幕为止所发生的所有事件.无论手势持续多长时间,只要一个或多个手指仍在屏幕上,这个手势就存在. 触摸是指把手指放到IOS设备的屏幕上,从 ...
- 毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库
毫无保留开源我写的:IOS Android Ipad 多点触摸通用js 库 在线演示地址: http://m.yunxunmi.com/ 支持 IOS Android Ipad 等不同操作系统的手持或 ...
- Objective-C 高级编程:iOS与OS X多线程和内存管理
<Objective-C 高级编程:iOS与OS X多线程和内存管理> 基本信息 原书名: Pro Multithreading and Memory Management for iOS ...
随机推荐
- windows下搭建学习objective-c 的运行环境【转载】
对于Iphone开发学习者而言,Object -c 是必修的语言.但是由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果iPhone等产品的应用程序, ...
- VS2012中数据库架构的比较
在进行项目进行开发或维护时,经常会改动使用的数据库,或增加.修改字段,或加表,改存储过程等,而且会出现多个类似的数据库同时在用(比如过个类似的项目,要使用稍有不同的数据库),这个时候就可能需要进行数据 ...
- Scala 基础入门【翻译】
原文地址 本文只是带你进入 Scala 的世界,包括安装.不可变量 val.可变量 var.定义类.集合(包括列表(list).集(set).映射(map))以及集合遍历和集合库(能达到并行/并发效果 ...
- 【LeetCode】257. Binary Tree Paths
Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...
- FoLlow 的技术博客
酷壳 http://coolshell.cn 老赵点滴- 追求编程之美 http://blog.zhaojie.me/ Pixel-In-Gene Blog
- leveldb - menifest文件格式
MANIFEST文件是Level DB的元信息文件,它里面的格式是leveldb的Log格式,一个menifest是一个record: void VersionEdit::EncodeTo(std:: ...
- angularjs, nodejs, express, gulp, karma, jasmine 前端方案整合
今年转向做前端开发,主要是做angularjs开发,期间接触了nodejs平台,从此一发不可收拾. npm丰富的插件库,express 开发框架, grunt, gulp构建工具,karma测试管理工 ...
- U3D包大小优化之microlib
当迩想把最小类库发上来,迩需要把Stripping Level设置为Use micro mscorlib 这里是MICROLIB所能使用的包的类库列表:http://docs.unity3d.com/ ...
- oracle 11g 如何创建、修改、删除list-list组合分区
Oracle11g在分区方面做了很大的提高,不但新增了4种复合分区类型,还增加了虚拟列分区.系统分区.INTERVAL分区等功能. 9i开始,Oracle就包括了2种复合分区,RANGE-HASH和R ...
- zmq 学习笔记
0. PUB/SUB, XPUB/XSUB filtering happens at publisher sides when sockets are using a connected protoc ...