iOS基础篇(十七)——UIGestureRecognizer用法
UIGestureRecognizer(手势识别)在iOS 中非常重要,他极大地提高了移动设备的使用便捷性;
在3.2之前是主要使用的是由UIResponder而来的如下4种方式:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
但是由于这种方式需要自己计算做不同的手势分辨,实在麻烦。
在3.2 以后,提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作。
1、拍击——UITapGestureRecognizer
2、向里或向外捏——UIPinchGestureRecognizer
3、摇动或者拖拽——UIPanGestureRecognizer
4、擦碰——UISwipeGestureRecognizer
5、旋转——UIRotationGestureRecognizer
6、长按——UILongPressGestureRecognizer
每个手势识别器的用法都差不多,以UITapGestureRecognizer为例:
//创建手势识别器对象并监听手势的触发
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
//连续敲击次数
tap.numberOfTapsRequired = ;
//需要两根手指一起敲击
tap.numberOfTouchesRequired = ;
//添加手势到指定的view上
[self.view addGestureRecognizer:tap];
敲击实例:
1、UITapGestureRecognizer 拍击
//创建手势识别器对象并监听手势的触发
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
//连续敲击次数
tap.numberOfTapsRequired = ;
//需要两根手指一起敲击
tap.numberOfTouchesRequired = ;
//添加手势到指定的view上
[self.view addGestureRecognizer:tap]; - (void)tapAction:(UITapGestureRecognizer*)tapGesture{ NSLog(@"我敲击了屏幕"); CGPoint point = [tapGesture locationInView:self.view];
NSLog(@"tapAction:%f,%f",point.x,point.y);
}
输出:

2、UIPinchGestureRecognizer 向里或向外捏
UIPinchGestureRecognizer *Pinch =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(PinchAction:)];
Pinch.delegate = self;
[imageView addGestureRecognizer:Pinch]; - (void)PinchAction:(UIPinchGestureRecognizer*)pinchGesture{
pinchGesture.view.transform = CGAffineTransformScale(pinchGesture.view.transform, pinchGesture.scale, pinchGesture.scale);
pinchGesture.scale = ;
}
3、UIPanGestureRecognizer 摇动或者拖拽
//先放置一张图片实施拖拽
imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"u=3971024035,4095552302&fm=21&gp=0"]];
[imageView setFrame:(CGRect){50,50,100,100}];
[self.view addSubview:imageView];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
pan.delegate = self;
[self.view addGestureRecognizer:pan]; //设置触发拖拽的最少触摸点,默认为1
pan.minimumNumberOfTouches = ;
//设置触发拖拽的最多触摸点
pan.maximumNumberOfTouches = ; - (void)panAction:(UIPanGestureRecognizer *)panGesture{
CGPoint point = [panGesture locationInView:self.view]; NSLog(@"panAction:(%f, %f)",point.x, point.y);
imageView.center = point; if (panGesture.state==UIGestureRecognizerStateBegan) {
NSLog(@"panAction StateBegan:(%f,%f)", point.x, point.y);
} if (panGesture.state==UIGestureRecognizerStateChanged) {
NSLog(@"panAction StateChanged:(%f,%f)", point.x, point.y);
} if (panGesture.state==UIGestureRecognizerStateEnded) {
NSLog(@"panAction StateEnded:(%f,%f)", point.x, point.y);
} }

输出:

4、UISwipeGestureRecognizer 擦碰
UISwipeGestureRecognizer *leftSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeAction:)];
[self.view addGestureRecognizer:leftSwipeGesture];
leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft; UISwipeGestureRecognizer *rightSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(SwipeAction:)];
[self.view addGestureRecognizer:rightSwipeGesture];
rightSwipeGesture.direction = UISwipeGestureRecognizerDirectionRight; - (void)SwipeAction:(UISwipeGestureRecognizer*)swipeGesture{
if (swipeGesture.direction==UISwipeGestureRecognizerDirectionLeft) {
NSLog(@"swipeGesture:Left");
}
if (swipeGesture.direction==UISwipeGestureRecognizerDirectionRight) {
NSLog(@"swipeGesture:Right");
}
}
输出:

5、UIRotationGestureRecognizer 旋转
UIRotationGestureRecognizer *rotations = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
rotations.delegate = self;
rotation = ;
[self.view addGestureRecognizer:rotations]; - (void)rotationAction:(UIRotationGestureRecognizer*)rotationGesture{
imageView.transform = CGAffineTransformMakeRotation(rotation+rotationGesture.rotation); if (rotationGesture.state==UIGestureRecognizerStateEnded) {
rotation += rotationGesture.rotation;
} }
6、UILongPressGestureRecognizer 长按
UILongPressGestureRecognizer *longp = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longAction:)];
[self.view addGestureRecognizer:longp]; longp.numberOfTouchesRequired = ;
//长按时间为2秒
longp.minimumPressDuration = ;
//允许15秒中运动
longp.allowableMovement = ; - (void)longAction:(UILongPressGestureRecognizer *)longPress{
CGPoint point = [longPress locationInView:self.view];
imageView.center = point; if(longPress.state == UIGestureRecognizerStateBegan){
NSLog(@"longAction StateBegan: (%f, %f)", point.x, point.y);
} if(longPress.state == UIGestureRecognizerStateEnded){
NSLog(@"longAction StateEnded: (%f, %f)", point.x, point.y);
}
}
输出:

iOS基础篇(十七)——UIGestureRecognizer用法的更多相关文章
- ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别
一.Delegate Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递.iphone中常用@protocol和delegate的机制来实现接口的功能. ...
- ios基础篇(十四)——UITableView(二)属性及基本用法
上一篇说了UITableView的重用机制,让我们对UITableView有了简单了解,下面说说UITableView的属性及常见方法. 一.属性 1.frame:设置控件的尺寸和大小 2.backg ...
- ios基础篇(二十七)—— Json解析
一.什么是Json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使 ...
- iOS基础篇(十五)——UIScrollView的基本用法
滚动视图(UIScrollView)通常用于显示内容尺寸大于屏幕尺寸的视图. 一.基本属性 1.CGSize contentSize :设置UIScrollView的滚动范围 2.CGPoint co ...
- ios基础篇(七)——UISwich、UISlider、UIProgressView的用法总结
一.UISlider UIslider滑块控件在IOS开发中会常用到,可用于调节音量,字体大小等UI方面的交互:UISlider实例提供一个控件,让用户通过左右拖动一个滑块(可称其为“缩略图”)来选择 ...
- ios基础篇(二)——UIImageView的常见用法
UIImageView是在界面上显示图片的一个控件,在UIImageView中显示图片的话应该首先把图片加载到UIImage中,然后通过其他方式使用该UIImage. 创建UIImageView有两种 ...
- ios基础篇(一)——UIView控件基本属性与常见用法
1.frame 控件的位置和尺寸(以父控件的左上角为坐标原点(0,0)) 2.center 控件的中点(以父控件的左上角为坐标原点) 3.bounds 控件的位置和尺寸(以自己的左上角为坐标原点(0, ...
- ios基础篇(十六)——UIWebView的基本使用
UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档等.UIWebView是一个混合体,具体的功能控件内置的,实现一些基本的功能.UIWebView可以查看Html网页,pdf文件,do ...
- ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)
一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...
随机推荐
- [HTML5]移动开发不同手机弹出数字键盘问题
这里还是先那么先交代一下遇到的问题.其实无论是tel还是number都不是完美的:type="tel"优点是iOS和Android的键盘表现都差不多缺点是那些字母好多余,虽然我没有 ...
- 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏
压缩文本.字节或者文件的压缩辅助类-GZipHelper 欢迎收藏 下面为大家介绍一.NET下辅助公共类GZipHelper,该工具类主要作用是对文本.字符.文件等进行压缩与解压.该类主要使用命名空间 ...
- svg学习(二)
svg嵌入html有以下3种方式: OBJECT < object data = " rect.svg " width = " 300 " heigh ...
- sql join 优化
项目查询列表,需要新关联一张表,于是就让组下小伙更改了下sql语句,当再次进入列表查询时查询时间一下子就翻倍.那小伙找了半天没找原因. 于是我就打开代码查看,关联的一张表数据非常多,用的left jo ...
- javascript的语法结构
字符规范: javascript程序是采用的Unicode字符集编写的,并且区分大小写.但是html代码不区分大小写,比如,在html中点击事件就可以写成onClick或则onclick,但是在jav ...
- echo(),print(),print_r(),var_dump的区别?
常见的输出语句 echo()可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用. print()函 ...
- ubuntu 中增加鼠标右键菜单,为Windows 的exe 程序快速增加桌面快捷键
#!/bin/bashmyfile=$NAUTILUS_SCRIPT_SELECTED_FILE_PATHSmyfilename=${myfile##*/}myfilename=${myfilenam ...
- 1350. Primary Arithmetic
Children are taught to add multi-digit numbers from right-to-left one digit at a time. Many find th ...
- [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
转载地址:http://blog.csdn.net/xbl1986/article/details/7216668 Xcode是Version 4.2 Build 4D151a 根据Objective ...
- R之data.table -melt/dcast(数据合并和拆分)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px "Helvetica Neue"; color: #323333 } p. ...