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 ...
随机推荐
- 转载:android.屏幕锁,解锁,在取证上的应用
中国司法-鉴定,2013年第06期杂志
- 转:VC解析XML文件-CMarkup的使用详解
本篇文章是对VC解析XML文件-CMarkup的使用进行了详细的分析介绍,需要的朋友参考下 VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等. 据说tinyX ...
- android通话时第二通电话呼叫等待提示音音量大小
callnotifier.java public void run() { ...... switch (mToneId) { case TO ...
- 小米2成功使用google组件的办法(为了coc游戏能登录google账户)
1) 小米商店里下一个 “谷歌应用下载器”2) 用"谷歌应用下载器"安装相应的服务和应用(跟着提示把所有的服务都更新到最新版本就可以了,第3和第4可以不做)3) 小米商店里下一个 ...
- spring之ControllerAdvice注解
@ControllerAdvice是Spring 3.2新增的注解,主要是用来Controller的一些公共的需求的低侵入性增强提供辅助,作用于@RequestMapping标注的方法上. Contr ...
- Asp.net Core中使用NLog,并封装成公共的日志方法
1.安装NLog "NLog.Extensions.Logging": "1.0.0-rtm-alpha4" 2.配置NLog public void Conf ...
- Win7 安装Apache 2.2.4报错:<OS 5>拒绝访问. :Failed to open the WinNT service manager
Apache 2.2安装档与win7的“用户账户控制”冲突,所以只要先关闭,安装完后再开启即可. 重启,然后再重新安装Apache2.2.4,没有出现错误.然后再把上述设置改回去. 参考:http:/ ...
- 手机软件mockup设计工具
软件界面设计工具 UIDesigner v2.5 详见 http://www.downyi.com/downinfo/26770.html
- select into的不同数据库实现
DB2中修改表的schema除了通常的创建别名,还可以删除表重建 删除表的顺序应该是先在另一个Schema下新建表,然后使用select ino将原表的数据导入新表,再删除原表. 实现如下: 在Sch ...
- Xcode 文档注释方法
摘自:http://www.cnblogs.com/bomo/p/4815963.html 文档注释,可以在调用时显示注释信息,让调用者更好的理解方法的用途. 注释方法: /// 注释 和 /** 注 ...