IOS各种手势操作实例
先看下效果
手势相关的介绍
IOS中手势操作一般是 UIGestureRecognizer 类的几个手势子类去实现,一般我们用到的手势就这么5种:
1、点击 UITapGestureRecognizer
2、平移 UIPanGestureRecognizer
3、缩放 UIPinchGestureRecognizer
4、旋转 UIRotationGestureRecognizer
5、轻扫 UISwipeGestureRecognizer
我们上面这个实例中就用到了上面这5种手势,不过其中 点击与轻扫没有体现出来,只是输出了下日志而已,一会看代码
下面我们来分别介绍下这几种手势
1、UITapGestureRecognizer 点击手势
UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];
// 点击次数,默认为1,1为单击,2为双击
tapGes.numberOfTapsRequired = ;
这个点击手势类有一个属性 numberOfTapsRequired 用于设置点击数,就是点击几次才触发这个事件
2、UIPanGestureRecognizer 平移手势
// 平移手势
- (void)initPanGes{ UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)]; [self.imgView addGestureRecognizer:panGes];
} - (void)panGes:(UIPanGestureRecognizer*)ges{ // 获取平移的坐标点
CGPoint transPoint = [ges translationInView:self.imgView];
}
平移手势本身没太多可设置的属性,在平移事件触发手,可以用 translationInView 方法获取当前平移坐标点
3、UIPinchGestureRecognizer 缩放手势
// 缩放手势
- (void)initPinGes{ UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)];
[self.imgView addGestureRecognizer:pinGes];
}
- (void)pinGes:(UIPinchGestureRecognizer*)ges{ // 缩放
self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale);
}
缩放手势在事件里面可以获取 scale 属性,表示当前缩放值
4、UIRotationGestureRecognizer 旋转手势
// 旋转手势
- (void)initRotation{ UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)];
[self.imgView addGestureRecognizer:rotationGes];
}
- (void)rotationGes:(UIRotationGestureRecognizer*)ges{ // 旋转图片
self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation);
}
旋转手势在事件里面可以通过获取 rotation 属性获取当前旋转的角度
5、UISwipeGestureRecognizer 轻扫手势
// 轻扫手势
- (void)initSwipeGes{ // 创建 从右向左 轻扫的手势
UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
// 方向,默认是从左往右
// 最多只能开启一个手势,如果要开启多个就得创建多个手势
// 监听从右向左的方向
swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft;
[self.imgView addGestureRecognizer:swipeLeftGes]; }
- (void)swipeGes:(UISwipeGestureRecognizer*)ges{ // ges.direction方向值
NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);
}
轻扫手势对象需要设置 direction 属性,默认是只监听从左向右,这是一个枚举值 UISwipeGestureRecognizerDirection
UISwipeGestureRecognizerDirectionRight 从左向右(默认值)
UISwipeGestureRecognizerDirectionLeft 从右向左
UISwipeGestureRecognizerDirectionUp 从下向上
UISwipeGestureRecognizerDirectionDown 从上向下
下面看一下我们上面那个效果图实现代码吧
//
// ViewController.m
// 各种手势操作
//
// Created by xgao on 16/3/24.
// Copyright © 2016年 xgao. All rights reserved.
// #import "ViewController.h" @interface ViewController ()<UIGestureRecognizerDelegate> @property (weak, nonatomic) IBOutlet UIImageView *imgView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; [self initTapGes];
[self initPanGes];
[self initPinGes];
[self initRotation];
[self initSwipeGes];
} // 点击手势
- (void)initTapGes{ UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];
// 点击次数,默认为1,1为单击,2为双击
tapGes.numberOfTapsRequired = ;
tapGes.delegate = self; [self.imgView addGestureRecognizer:tapGes];
}
- (void)tapGes:(UITapGestureRecognizer*)ges{ NSLog(@"%s",__func__);
} // 平移手势
- (void)initPanGes{ UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)]; panGes.delegate = self; [self.imgView addGestureRecognizer:panGes];
}
- (void)panGes:(UIPanGestureRecognizer*)ges{ // 获取平移的坐标点
CGPoint transPoint = [ges translationInView:self.imgView]; // 在之前的基础上移动图片
self.imgView.transform = CGAffineTransformTranslate(self.imgView.transform, transPoint.x, transPoint.y); // 复原,必需复原
// 每次都清空一下消除坐标叠加
[ges setTranslation:CGPointZero inView:self.imgView]; NSLog(@"%s",__func__);
} // 缩放手势
- (void)initPinGes{ UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)];
pinGes.delegate = self; [self.imgView addGestureRecognizer:pinGes];
}
- (void)pinGes:(UIPinchGestureRecognizer*)ges{ // 缩放
self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale); // 复原
// 每次都清空一下消除叠加
ges.scale = ;
} // 旋转手势
- (void)initRotation{ UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)];
rotationGes.delegate = self; [self.imgView addGestureRecognizer:rotationGes];
}
- (void)rotationGes:(UIRotationGestureRecognizer*)ges{ // 旋转图片
self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation); // 复原
// 每次都清空一下消除叠加
ges.rotation = ; NSLog(@"%s",__func__);
} // 轻扫手势
- (void)initSwipeGes{ // 创建 从右向左 轻扫的手势
UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
// 方向,默认是从左往右
// 最多只能开启一个手势,如果要开启多个就得创建多个手势
// 监听从右向左的方向
swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeftGes.delegate = self; [self.imgView addGestureRecognizer:swipeLeftGes]; // 创建 从下向上 轻扫的手势
UISwipeGestureRecognizer* swipeUpGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
// 监听从下向上的方向
swipeUpGes.direction = UISwipeGestureRecognizerDirectionUp;
swipeUpGes.delegate = self; [self.imgView addGestureRecognizer:swipeUpGes];
}
- (void)swipeGes:(UISwipeGestureRecognizer*)ges{ // ges.direction方向值
NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);
} #pragma mark - UIGestureRecognizerDelegate // 判断是否能触发手势
- (BOOL)gestureRecognizerShouldBegin:(UITapGestureRecognizer *)gestureRecognizer{ return YES;
} // 是否允许多手势操作,不是多触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES;
} @end
这里需要注意的有两点:
1、对于 平移、缩放、旋转 这3个手势,我们如果要用它的值去处理的话,要记得复原!复原!复原!这点很重要!重要的事说3遍~~
平移手势里面我们需要设置 setTranslation:CGPointZero 来复原它的坐标值,不然下一次事件触发这个坐标值会叠加
缩放手势里面设置 ges.scale = 1 来复原它的缩放值
旋转手势里面设置 ges.rotation = 0 来复原它的角度值
2、假如我们需要多手势一起用的时候就需要设置下delegate 里面的一个返回参数的方法了
// 是否允许多手势操作,不是多触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES;
}
这次分享就到这里~~有什么不清楚的,就留言吧 ^_^
IOS各种手势操作实例的更多相关文章
- ios的手势操作之UIGestureRecognizer浅析
转载地址:http://blog.csdn.net/likendsl/article/details/7554150 每一个手势的实现例子,可参考下面网址:http://www.cnblogs.com ...
- 【转】 ios的手势操作之UIGestureRecognizer浅析
一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)touchesBegan:(NSSet *)touches withE ...
- Android学习指南之三十八:Android手势操作编程[转]
手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...
- iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureReco ...
- iOS手势操作,拖动,轻击,捏合,旋转,长按,自定义(http://www.cnblogs.com/huangjianwu/p/4675648.html)
1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureReco ...
- iOS项目之“返回”手势操作相关
在程序中,总会设置“返回”按钮,但不可能在每一个控制器中都去设置一次“返回”按钮,那如何设置全局的“返回”按钮呢? 首先自定义一个导航控制器,在tabBarController中添加子控制器时,使用这 ...
- [BS-25] IOS中手势UIGestureRecognizer概述
IOS中手势UIGestureRecognizer概述 一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)touches ...
- 点击事件touches与ios的手势UIGestureRecognizer
.h文件 @property (weak,nonatomic) IBOutlet UILabel *messageLabel;@property (weak,nonatomic) IBOutlet U ...
- ios各种手势,很有意思
转自http://blog.csdn.net/likendsl/article/details/7554150 这哥们很厉害的 一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由U ...
随机推荐
- CoreData和FMDB你用哪个?
概括: 我们先说说这两个东西,CoreData 和 FMDB,其实就我自己而言觉得这两个都不错,刚开始是接触FMDB的,CoreData是工作后自己看的.苹果推荐开发者去使用CoreData,但 FM ...
- C#中字符和字符串总结
Char类是C#提供的字符类型,String是C#提供的字符串类型. 字符: Char类在C#中表示一个Unicode字符. Char类只定义一个Unicode字符. Char类常用的方法及说明如下: ...
- CI Weekly #14 | 如何搭建合适的持续交付开发流程?
时隔 10 个月,flow.ci 开始正式收费上线.为感谢对我们的内测支持,所有内测用户可继续免费使用基础版 30 天,截止至 3 月 15 日失效.欢迎随时告诉我们你对收费版 flow.ci 的反馈 ...
- jquery和javascript的区别(常用方法比较)
jquery 就对javascript的一个扩展,封装,就是让javascript更好用,更简单.人家怎么说的来着,jquery就是要用更少的代码,漂亮的完成更多的功能.JavaScript 与JQu ...
- matlab分割背景与物体
[name,path]=uigetfile('*.jpg;*.png;*.bmp','选择一张图片');f=imread([path name]);count = 0; T = mean2(f); d ...
- P177 test 6-3 UVa536
//P177 test 6-3 #include<cstdio> #include<cstring> using namespace std; +],s2[+]; int re ...
- CLOSE_WAIT TIME_WAIT
TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放.网络服务器程序要同时 ...
- php 租房子(练习题)
一.题目要求 1.功能描述 出租房屋数据管理及搜索页面 2.具体要求 (1) 创建数据库HouseDB,创建表House,要求如下: 二.题目做法 1.建立数据库 2.封装类文件 <?php ...
- xcode升级到8.1
一.JPush集成: 1. xcode7在iOS10以上的真机上运行接收不到通知的问题,把xcode升级到8.1,在build phases -> link binary with librar ...
- 使用jQuery快速高效制作网页特效-----------------------------之jQuery事件与动画
1.基础事件 分为三个事件 1.1 window事件 所谓window事件,就是当用户执行某些会影响浏览器的操作时,而触发的事件. 1.2 鼠标事件 鼠标事件顾名思义就是当用户在文档上移动或单击鼠标时 ...