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];
}

运行效果:

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

时间: 2024-08-07 11:35:53

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

《iOS 高级编程》之Tableview进阶指南

本章内容: ●    学习如何进阶使用UITableView,带给应用更高级的观感(look and feel) ●    学习如何开发自己定制的UITableView类,模仿iMessage应用的观感 ●    为一个基于分组的UITableView实现下钻逻辑 在iOS应用中呈现数据时,UITableView可能是最经常使用的用户界面对象.在本章中,将学习到以超越标准实现的方式使用UITableView,并理解UITableView类的工作方式.你会创建一个聊天视图控制器,它支持定制的单元格

第一章:多点触摸与手势检测

一.响应者链 只要继承了UIResponder的对象就可作为事件的响应者,实际上UIControl继承了UIView,UIView又继承了UIResponder,由此可见,所有的对象都可作为事件的响应者. 当用户与某个控件交互时,该控件将作为"第一响应者(First Responder)",第一响应者将作为响应者链的开始,该事件首先被发送给第一响应者(也就是用户触摸屏幕的控件).事件将沿着响应者链一直向下传播,直到被某个响应者处理.事件响应者链的典型传播路线如下: First Resp

IOS 触摸与手势

触摸 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIView??????不接受触摸时间的三种情况?????????????????? •  ????不接受用户交互????????????userInteractionEnable = NO;??

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

原文:WPF 多点触摸开发[2]:WPF触摸的几个手势的执行顺序 前面我讲了在win7下使用模拟器,进行调试模拟多点触摸,其实际开发中这样也比较麻烦.. 要拿几个鼠标. 所以更多的人会 买个触摸套 套在显示屏上. 这样可支持 2点触摸. 又没有正真触摸屏的昂贵,价格也相对优惠很多. 接下来进入正题 . WPF其实本身对触摸事件就支持. 其中有些高及触屏的操作的手势路由事件. 大大增强了用户体验性. 使得我们能做出类似iphone手机的的触控效果.并使之这些柔和的效果 移植到桌面触摸应用上. 首先

OC高级编程iOS多线程个人理解一

大部分笔记源自于:Objective-C高级编程(iOS与OS多线程和内存管理)一书,时间有些久远,甚至GCD网上说已经不需要手动释放release了,但是书中强调是使用GCD需要开发者自己管理计数. 首先什么是GCD? 这是Apple公司为了方便开发者,使开发者更专注于多线程中的任务执行内容的API,官方说明中:开发者要做的只是定义想执行的任务并追加到适当的Dispatch Queue中.是C语言但被组建成面像对象风格.他是我们是用来异步执行任务的技术之一.还有Pthread,NSThread

ios开发——实用技术篇Swift篇&amp;多点触摸与手势识别

多点触摸与手势识别 1 2 //点击事件 3 var atap = UITapGestureRecognizer(target: self, action: "tapDo:") 4 self.view.addGestureRecognizer(atap) 5 atap.numberOfTapsRequired = 1 //单击次数 6 atap.numberOfTouchesRequired = 1 //手指个数 7 8 //拖动事件 9 var aPan = UIPanGesture

iOS网络高级编程:iPhone和iPad的企业应用开发之错误处理

本章内容 ●    iOS应用中的网络错误源 ●    检测网络的可达性 ●    错误处理的经验法则 ●    处理网络错误的设计模式 到目前为止,我们所介绍的iPhone与其他系统的网络交互都是基于一切正常这个假设.本章将会放弃这个假设,并深入探究网络的真实世界.在真实世界中,事情是会出错的,有时可能是非常严重的错误:手机进入与离开网络.包丢掉或是延迟:网络基础设施出错:偶尔用户还会出错.如果一切正常,那么编写iOS应用就会简单不少,不过遗憾的是现实并非如此.本章将会探讨导致网络操作失败的几

iOS开发-核心动画高级编程Core Animation系列(转)

iOS-Core-Animation-Advanced-Techniques 转 GitHub译文 iOS核心动画高级编程全集 iOS-核心动画高级编程/1-图层树 iOS-核心动画高级编程/2-寄宿图 iOS-核心动画高级编程/3-图层几何学 iOS-核心动画高级编程/4-视觉效果 iOS-核心动画高级编程/5-变换 iOS-核心动画高级编程/6-专有图层 iOS-核心动画高级编程/7-隐式动画 iOS-核心动画高级编程/8-显示动画 iOS-核心动画高级编程/9-图层时间 iOS-核心动画高

支持元素惯性拖放和多点触摸手势的js插件

interact.js是一款支持元素惯性拖放和多点触摸手势的js插件.该插件支持在桌面设备和移动手机设备中拖放元素,拖动结束时带有惯性效果.并且支持移动设备的多点触摸手势.它的特点有: 带惯性和吸附效果 支持多元互动 跨浏览器和设备,支持桌面和移动版本的Chrome, Firefox 和 Opera浏览器以及IE8+浏览器 可以和SVG元素相互作用 轻量级,无任何外部依赖 除非要支持IE8或修改鼠标样式,否则不用修改任何DOM元素 效果演示:http://www.htmleaf.com/Demo