手势事件基础知识和例子

点击手势UITapGestureRecognizer

创建手势处理器

<pre>
//新建轻拍手势事件类并添加手势事件
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleTap:)];
//哪个view需要添加上手势事件
[self addGestureRecognizer:gesture];
</pre>

一些相关的属性(官方解析)

numberOfTapsRequired----设置该点击手势处理器只处理的点击次数,默认为1

numberOfTouchesRequired----默认值为1.需要处理的手指数

UIPinchGestureRecognizer 缩放

<pre>
// 创建UIPinchGestureRecognizer手势处理器,该手势处理器激发scaleImage方法
UIPinchGestureRecognizer* gesture = [[UIPinchGestureRecognizer alloc]
initWithTarget:self action:@selector(scaleImage:)];
// 为imageView添加手势处理器
[self.imageView addGestureRecognizer:gesture];
</pre>

一些相关的属性

scale----相对于屏幕坐标中的触摸点的比例

velocity----缩放速度/秒

例子-通过捏合手势缩放图片

<pre>

  • (void) scaleImage:(UIPinchGestureRecognizer*)gesture
    {
    CGFloat scale = gesture.scale;
    // 如果捏合手势刚刚开始
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
    // 计算当前缩放比
    currentScale = self.imageView.image.size.width / srcImage.size.width;
    }
    // 根据手势处理的缩放比计算图片缩放后的目标大小
    CGSize targetSize = CGSizeMake(srcImage.size.width * scale * currentScale,
    srcImage.size.height * scale * currentScale);
    // 对图片进行缩放
    self.imageView.image = [srcImage imageByScalingToSize:targetSize];
    }
    </pre>

不多说,直接上Demo例子https://git.oschina.net/qjz.com/pinchImage/tree/master

旋转手势UIRotationGestureRecognizer

<pre>
//新建旋转手势事件类并添加手势事件
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)];
[self.viewPhoth addGestureRecognizer:rotationGesture];
</pre>

一些相关的属性

rotation----旋转的弧度

velocity----缩放速度/秒

旋转图片的例子

<pre>

  • (void) rotateImage:(UIRotationGestureRecognizer*)gesture
    {
    // 获取手势旋转的弧度
    CGFloat rotation = gesture.rotation;
    // 根据当前缩放比计算图片缩放后的目标大小
    CGSize targetSize = CGSizeMake(srcImage.size.width * currentScale,
    srcImage.size.height * currentScale);
    // 对图片进行缩放、旋转
    self.imageView.image = [[srcImage imageByScalingToSize:targetSize]
    imageRotatedByRadians:currentRotation + rotation];
    // 如果旋转手势结束
    if(gesture.state == UIGestureRecognizerStateEnded)
    {
    currentRotation = currentRotation + rotation;
    }
    }
    </pre>
    不多说,直接上demo栗子https://git.oschina.net/qjz.com/pinchImage/tree/master

长按手势UILongPressGestureRecognizer

创建手势处理器

<pre>
//新建长按手势事件类并添加手势事件
UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(viewLongPressGesture:)];
//哪个view需要添加上手势事件
[self addGestureRecognizer:longGesture];
</pre>

一些相关的属性(官方解析)

numberOfTapsRequired----默认值为0.在按下手势识别之前所需的全部点击数

numberOfTouchesRequired----默认值为1.要识别的手势必须按住的手指数

minimumPressDuration----默认值为0.5。 以秒为单位的手指必须按住手势才能识别手势

allowableMovement----默认值为10.手势失败前允许的最大移动(以像素为单位)。 一旦识别(在minimumPressDuration之后),对于触摸跟踪的剩余部分,手指移动没有限制

长按手势中的一些事件

<pre>
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, //识别器尚未识别其姿势,但可以是评估触摸事件。 这是默认状态
UIGestureRecognizerStateBegan, // 识别器已经接收到被识别为手势的触摸。 action方法将在下一个运行循环中调用
UIGestureRecognizerStateChanged, //识别器已经接收到被识别为对手势的改变的触摸。 action方法将在下一个运行循环中调用
UIGestureRecognizerStateEnded, // 识别器已经接收到被识别为手势的结束的触摸。 action方法将在下一个运行循环中被调用,识别器将被重置为UIGestureRecognizerStatePossible
UIGestureRecognizerStateCancelled, // 识别器已经接收到导致手势的取消的触摸。 action方法将在下一个运行循环中调用。 识别器将被重置为UIGestureRecognizerStatePossible

UIGestureRecognizerStateFailed,     // 识别器已经接收到不能被识别为手势的触摸序列。 将不会调用操作方法,并且识别器将重置为UIGestureRecognizerStatePossible
// 离散手势 - 识别离散事件但不报告更改的手势识别器(例如,轻敲)不会通过“开始”和“已更改”状态进行切换,也不会失败或被取消
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 识别器已经接收到被识别为手势的触摸。 action方法将在下一个运行循环中被调用,识别器将被重置为UIGestureRecognizerStatePossible

};
</pre>

移动(轻扫)手势UISwipeGestureRecognizer

<pre>

for (int i = 0 ; i < 4 ; i++)
{
// 创建手势处理器,指定使用该控制器的handleSwipe:方法处理轻扫手势
UISwipeGestureRecognizer* gesture = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
// 设置该点击手势处理器只处理i个手指的轻扫手势
gesture.numberOfTouchesRequired = 1;
// 指定该手势处理器只处理1 << i方向的轻扫手势
gesture.direction = 1 << i;
// 为gv控件添加手势处理器。
[self.gv addGestureRecognizer:gesture];
}

</pre>

一些相关的属性值

numberOfTouchesRequired----默认值为1.必须滑动的手指数

@property(nonatomic) UISwipeGestureRecognizerDirection direction ----默认为UISwipeGestureRecognizerDirectionRight。 所需的滑动方向。 可以指定多个方向,如果它们将导致相同的行为(例如,UITableView滑动删除)

补充UISwipeGestureRecognizerDirection一共四个值,分别是右、左、上、下

typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionRight = 1 << 0,
UISwipeGestureRecognizerDirectionLeft = 1 << 1,
UISwipeGestureRecognizerDirectionUp = 1 << 2,
UISwipeGestureRecognizerDirectionDown = 1 << 3
};

使用例子:
<pre>
// 实现手势处理器的方法,该方法应该声明一个形参。
// 当该方法被激发时,手势处理器会作为参数传给该方法的参数。

  • (void) handleSwipe:(UISwipeGestureRecognizer)gesture
    {
    // 获取轻扫手势的方向
    NSUInteger direction = gesture.direction;
    // 根据手势方向的值得到方向字符串
    NSString
    dirStr = direction == UISwipeGestureRecognizerDirectionRight
    ? @"向右" : (direction == UISwipeGestureRecognizerDirectionLeft
    ? @"向左" : (direction == UISwipeGestureRecognizerDirectionUp
    ? @"向上" :@"向下"));
    NSUInteger touchNum = gesture.numberOfTouchesRequired;
    self.label.text = [NSString stringWithFormat:
    @"用户使用%d个手指进行轻扫,方向为:%@" , touchNum , dirStr];
    // 指定2秒后清除label的文本
    [self.label performSelector:@selector(setText:)
    withObject:@"" afterDelay:2];
    }
    </pre>

不多说,直接上demo栗子https://git.oschina.net/qjz.com/pinchImage/tree/master

一个仿支付宝“更多”长按移动View,动态动画的参考Demo https://github.com/wolfhous/HSUpdateApp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 手势识别器是附加到视图的对象,将低级别事件处理代码转换为更高级别的操作,它允许视图以控件执行的方式响应操作。 手势...
    坤坤同学阅读 3,893评论 0 9
  • -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实...
    翘楚iOS9阅读 2,812评论 0 13
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,617评论 4 59
  • 高中曾有段时间数学课上在数学课本写一些童话故事,现在影响最深的那篇还记得,其实我也不太清楚当时为什么写,只是隐隐有...
    汝墨yan阅读 268评论 0 1