iphone的手势与触摸编程学习笔记

简介: 一、基本概念与理解:Cocoa Touch将触摸事件发送到正在处理的视图。触摸传达的信息包括: 触摸发生的位置 (当前位置、最近的历史位置) 触摸的阶段 (按下、移动、弹起)  轻击数量 (tapCount 单击/双击)  触摸发生时间 (时间戳)   每个UITouch对象都代表一个触摸事件。

 

一、基本概念与理解:
Cocoa Touch将触摸事件发送到正在处理的视图。触摸传达的信息包括:

  • 触摸发生的位置 (当前位置、最近的历史位置)
  • 触摸的阶段 (按下、移动、弹起) 
  • 轻击数量 (tapCount 单击/双击) 
  • 触摸发生时间 (时间戳)  

每个UITouch对象都代表一个触摸事件。在iPhone中,触摸交互遵循一种原始的设计模式,即在UIView类中而非UIViewController类中编程实现。就是说触摸交互采用视图级编程方式。  

如何触摸的,即所谓的基本手势,包括:

  • Swipe:滑过,快速移动
  • Pinch Open:二指往外拨动
  • Pinch Close:二指往内拨动
  • Tap:轻击
  • Touch and hold:长按

这些手势的具体实现最原始的(相对最新的iOS版本)就是通过4个视图方法自定义编程来实现。

二、 触摸和视图方法——自定义手势编程
       预定义的4个回调方法就是处理屏幕上触摸的开始、移动和结束。

       当用户开始触摸屏幕时,在事件的开始阶段被调用——touchesBegan: withEvent:

       处理手指的移动——touchesMoved: withEvent:

       当手指离开屏幕时,结束触摸过程——touchesEnded: withEvent:

       必须响应持续触摸事件的系统中断时调用——touchesCancelled: withEvent:

这4个方法都是一种UIResponder方法,通常在UIView子类中实现。所有视图继承了这些方法的基本版本。示例:自定义一个Tickle(类似划卡)手势。

复制代码
//  TickleGestureRecognizer.h
//

#import <UIKit/UIKit.h>

typedef enum {
DirectionUnknown = 0,
DirectionLeft,
DirectionRight
} Direction;

@interface TickleGestureRecognizer : UIGestureRecognizer

@property (assign) int tickleCount;
@property (assign) CGPoint curTickleStart;
@property (assign) Direction lastDirection;

@end
复制代码

 

复制代码
//
// TickleGestureRecognizer.m
//

#import "TickleGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

#define REQUIRED_TICKLES 2
#define MOVE_AMT_PER_TICKLE 25

@implementation TickleGestureRecognizer
@synthesize tickleCount;
@synthesize curTickleStart;
@synthesize lastDirection;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
self.curTickleStart = [touch locationInView:self.view];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint ticklePoint = [touch locationInView:self.view];
CGFloat moveAmt = ticklePoint.x - curTickleStart.x;
Direction curDirection;
if (moveAmt < 0) {
curDirection = DirectionLeft;
}else{
curDirection = DirectionRight;
}
if (ABS(moveAmt) < MOVE_AMT_PER_TICKLE) return;

// Make sure we've switched directions
if (self.lastDirection == DirectionUnknown || (self.lastDirection == DirectionLeft && curDirection == DirectionRight) || (self.lastDirection == DirectionRight && curDirection == DirectionRight)) {

self.tickleCount++;
self.curTickleStart = ticklePoint;
self.lastDirection = curDirection;

if (self.state == UIGestureRecognizerStatePossible && self.tickleCount > REQUIRED_TICKLES) {
[self setState:UIGestureRecognizerStateEnded];
}
}
}

- (void)reset {
self.tickleCount = 0;
self.curTickleStart = CGPointZero;
self.lastDirection = DirectionUnknown;
if (self.state == UIGestureRecognizerStatePossible) {
[self setState:UIGestureRecognizerStateFailed];
}
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self reset];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self reset];
}

@end
复制代码

其中方法locationInView:即获取当前Touch点位置。若是获取触摸动作之前的位置则用previousLocationInView:方法。以上定义了一个TickleGestureRecognizer新类实现了Tickle手势。具体使用则是:

复制代码
// 要用手势的UIView的控制器头文件中添加
- (void)handleTickle:(TickleGestureRecognizer *)recognizer;

// 要用手势的UIView的控制器实现文件
// viewDidLoad添加
TickleGestureRecognizer *recognizer = [[TickleGestureRecognizer alloc] initWithTarget:self action:@selector(handleTickle:)];
recognizer.delegate = self; // 又见强大的委托
[view addGestureRecognizer:recognizer]; // 用addGestureRecognizer方法将手势添加到视图上


// 委托的回调方法
- (void)handleTickle:(TickleGestureRecognizer *)recognizer {
// Code.....
}
复制代码

三、利用UIGestureRecognizer类给视图添加手势
       iOS3.0后引入了UIGestueRecognizer类帮助我们处理触摸动作下各种手势的添加实现。要点就是在要添加手势的视图的控制器类必须实现UIGestureRecognizerDelegate委托协议。其实从编码角度看,就是苹果公司将所有的基本手势由UIGestureRecognizer类来定义实现了(与自定义编程中的TickleGestureRecognizer异曲同工)并引入的委托机制。

四、iOS5.0中可以在StoryBoard Editor中可视化添加手势

 

来源:http://www.cnblogs.com/lovecode/archive/2011/12/08/2281232.html

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
6月前
|
iOS开发
你知道IOS移动端到操作手势有哪些吗?
你知道IOS移动端到操作手势有哪些吗?
104 0
|
前端开发 JavaScript 定位技术
移动端手势事件和触摸交互
移动端手势事件和触摸交互
186 0
|
iOS开发
(六)IOS手势和触摸的用法
(六)IOS手势和触摸的用法
227 0
|
API iOS开发
iOS手势与变形
手势在用户交互中有着举足轻重的作用,这篇文字简单的介绍了iOS中的手势,并通过手势对控件进行变形处理。
111 0
|
Android开发 开发者
多点触控
多点触控
97 0
|
Android开发
安卓显示视频画面的动画效果及代码
最近客户提出,视频画面显示时黑屏体验不好,要求显示背景图。等视频画面来了再显示。 这个问题是怎么引起的?就在于安卓的View,设置了背景之后,就无法再显示视频画面(实际上肯定有绘制视频画面,UI流程上使得背景图一直显示)。
132 0
|
C# iOS开发
WPF触控程序开发(三)——类似IPhone相册的反弹效果
原文:WPF触控程序开发(三)——类似IPhone相册的反弹效果      用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动缩回,整个过程非常和谐、自然、精确,那么WPF能否做到呢,答案是肯定的。
1008 0