各种触摸手势

轻按(UITapGestureRecognizer) -- 用一个或多个手指在屏幕上轻按。

按住(UILongPressGestureRecognizer) -- 用一个或多个手指在屏幕上按住。

轻扫(UISwipeGestureRecognizer) -- 用一个或多个手指沿特定方向轻扫。

张合(UIPinchGestureRecognizer) -- 张合手指以缩放对象。

旋转(UIRotationGestureRecognizer) -- 沿圆形滑动两个手指。

平移(UIPanGestureRecognizer) -- 触摸并拖曳。

通过指定要使用的识别器(Recognizer)类型,并将其加入到视图(UIView)中,就能自动收到触发的多点触摸事件。有两种方式添加手势识别器:使用代码或使用Interface Builder编辑器以可视化方式添加。

可视化方式添加手势识别器:

1. 先找到手势控件组

2. 选中某一识别器,直接拖拽到控件上

识别器将作用于该控件,实际是增加了一个属性名为"gestureRecognizers"与该控件的连接。一个识别器可以连接多个控件:

需要注意的是,有一些控件(例如Label)默认没有允许"User Interaction Enabled"。这样手势将不生效,需要勾选后手势才能生效,对应的方法是setUserInteractionEnabled。

3. 定义操作

代码添加手势识别器:

- (IBAction)testTap:(id)sender 
{NSLog(@"Tap");//得到触点在视图中的坐标CGPoint point = [(UITapGestureRecognizer*)sender locationInView:self.btnTest];NSLog(@"x:%.2f,y:%.1f",point.x,point.y);
}- (void)viewDidLoad
{UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(testTap:)];tapRecognizer.numberOfTapsRequired = 1;tapRecognizer.numberOfTouchesRequired = 1;[self.btnTest addGestureRecognizer:tapRecognizer];[super viewDidLoad];
}

代码里的initWithTarget:self,是指明方法testTap所属的对象。大多数情况下简单指定为当前类就够了,但有时候也会写在外部类:

#import <Foundation/Foundation.h>@interface MyClass : NSObject- (void)testTap;@end
MyClass.h
#import "MyClass.h"@implementation MyClass- (void)testTap
{NSLog(@"a tap!");
}
MyClass.m
#import <UIKit/UIKit.h>
#import "MyClass.h"@interface ViewController : UIViewController
{MyClass *myClass;
}@property (strong, nonatomic) IBOutlet UIButton *btnTest;@end
ViewController.h
#import "ViewController.h"
#import "MyClass.h"@implementation ViewController
@synthesize btnTest;- (void)viewDidLoad
{myClass = [[MyClass alloc] init];UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:myClass action:@selector(testTap)];[self.btnTest addGestureRecognizer:tapRecognizer];[super viewDidLoad];
}
ViewController.m

注意:MyClass *myClass一定要声明在头文件ViewController.h,如果声明在ViewController.m会找不到testTap方法。这是因为在ViewController.m里会把MyClass声明成立局部变量,导致MyClass中的action不能正确识别自身所属的类。

轻按(UITapGestureRecognizer) 

轻按手势可以设定按下次数和触点数:

numberOfTapsRequired -- 需要轻按对象多少次才能识别出轻按手势,默认为1。

numberOfTouchesRequired -- 需要有多少个手指在对象上才能识别出轻按手势,默认为1。

轻扫(UISwipeGestureRecognizer) 

轻扫手势可以设定方向和触点数:

direction -- 轻扫方向,值是枚举UISwipeGestureRecognizerDirection中的一个,分别为:

UISwipeGestureRecognizerDirectionRight(向右,默认值)
UISwipeGestureRecognizerDirectionLeft(向左)
UISwipeGestureRecognizerDirectionUp(向上)
UISwipeGestureRecognizerDirectionDown(向下)

numberOfTouchesRequired -- 需要有多少个手指在对象上才能识别出轻按手势,默认为1。

P.s 如果要识别并相应不同的轻扫方向,必须实现多个轻扫手势识别器。通过编写代码,可让一个轻扫手势识别器响应多个轻扫方向,但无法区分不同的轻扫方向。例如:

- (void)viewDidLoad
{    UISwipeGestureRecognizer *leftSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(testSwipe:)];leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;[self.btnTest addGestureRecognizer:leftSwipeGesture];UISwipeGestureRecognizer *upSwipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(testSwipe:)];upSwipeGesture.direction = UISwipeGestureRecognizerDirectionUp;[self.btnTest addGestureRecognizer:upSwipeGesture];[super viewDidLoad];
}- (IBAction)testSwipe:(id)sender 
{UISwipeGestureRecognizer *swipeGesture = (UISwipeGestureRecognizer *)sender;if(swipeGesture.direction==UISwipeGestureRecognizerDirectionLeft){NSLog(@"left swipe!");}else if(swipeGesture.direction==UISwipeGestureRecognizerDirectionUp){NSLog(@"up swipe!");}
}

张合(UIPinchGestureRecognizer) 

轻扫手势可以设定缩放值和速度:

scale -- 默认为1。在必要的情况下可以通过改变这个值来调整放大缩小因子

velocity -- (张合手势发生的)速度,初始值为0。

- (void)viewDidLoad
{    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(testPinch:)];[self.imgView1 addGestureRecognizer:pinchGesture];[self.imgView1 setUserInteractionEnabled:YES];[super viewDidLoad];
}- (IBAction)testPinch:(id)sender 
{CGFloat scale = ((UIPinchGestureRecognizer *)sender).scale;self.imgView1.frame = CGRectMake(self.imgView1.frame.origin.x, self.imgView1.frame.origin.y, self.imgView1.frame.size.width*scale, self.imgView1.frame.size.height*scale);
}

旋转(UIRotationGestureRecognizer) 

旋转手势可以设定旋转角度和速度:

rotation -- 旋转角度(弧度值,可通过公式转换:度数=弧度数*180/Pi,弧度数=度数*Pi/180),初始值为0,随着每个旋转手势逐渐累积。可以将默认的初始旋转角度0修改为任何值,这样后续的旋转手势将以指定的值为起点。

velocity -- 速度,初始值为0。

- (void)viewDidLoad
{UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(testRotation:)];[self.imgView1 addGestureRecognizer:rotationGesture];[self.imgView1 setUserInteractionEnabled:YES];[super viewDidLoad];
}- (IBAction)testRotation:(id)sender 
{CGFloat rotation = ((UIRotationGestureRecognizer *)sender).rotation;self.imgView1.transform = CGAffineTransformMakeRotation(rotation);
}

摇动识别器

摇动的处理方式与其它手势不同,必须拦截一个类型为UIEventTypeMotion的UIEvent。为此,视图或视图控制器必须是响应者链中的第一响应者(FirstResponder),还必须实现方法motionEnded:withEvent。

step 1. 成为第一响应者(FirstResponder)

通过方法canBecomeFirstResponder允许视图控制器成为第一响应者,这个方法除了返回YES外什么都不做:

- (BOOL)canBecomeFirstResponder
{return YES;
}

在视图控制器加载视图后立即发送消息becomeFirstResponder,让视图成为第一响应者:

- (void)viewDidAppear:(BOOL)animated
{[self becomeFirstResponder];[super viewDidAppear:animated];
}

step 2. 响应摇动手势

实现方法motionEnded:withEvent:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{if(motion == UIEventSubtypeMotionShake){NSLog(@"Shaking things up!");}
}

转载于:https://www.cnblogs.com/CoderWayne/p/3596828.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔linux取消登录,宝塔面板如何关闭安全入口

通过 SSH 终端关闭安全入口通过 SSH 终端连接rm -f /www/server/panel/data/admin_path.pl即可关闭宝塔 Linux 面板的安全入口&#xff0c;关闭之后的面板登录地址就是&#xff1a;http://服务器 IP:8888。不过关闭这个安全入口之后很难恢复&#xff0c;所以不建议关闭宝塔面板…

一种通过变量插值读取属性的方法

最近&#xff0c;我尝试在应用程序服务器中定义和读取全局属性。 在应用程序服务器中配置的此类属性的好处–可以在此服务器上部署的所有Web应用程序之间共享该属性。 每个部署的应用程序都可以读取同一属性&#xff0c;该属性仅在一个位置配置一次。 我试图做的是在值部分中包…

[ofbiz]设置任务计划(job),提示service_item已经传递

问题描述&#xff1a;设置任务计划(job)&#xff0c;提示service_item已经传递 解决办法&#xff1a; 红色框内不要填写&#xff0c;就可以了。"已经传递"是翻译的不准确&#xff0c;应该是"已过时"&#xff0c;所以不设置开始时间&#xff0c;或者开始时间…

c r语言中rank函数,R语言的常用函数

基本一、数据管理vector&#xff1a;向量 numeric&#xff1a;数值型向量 logical&#xff1a;逻辑型向量character&#xff1b;字符型向量 list&#xff1a;列表 data.frame&#xff1a;数据框c&#xff1a;连接为向量或列表 length&#xff1a;求长度 subset&#xff1a;求子…

mongodb查询内嵌文档

mongodb查询内嵌文档假设有这样一个文档&#xff1a;db.XXX.remove();db.XXX.insert({"id":1, "members":[{"name":"BuleRiver1", "age":27, "gender":"M"}, {"name":"BuleRiver2"…

问号在c语言中运算符,C# 运算符 ?、??、?: 各种问号的用法和说明

1、可空类型修饰符(?)&#xff1a;引用类型可以使用空引用表示一个不存在的值&#xff0c;而值类型通常不能表示为空&#xff0c;例如:string strnull;是正确的。int inull&#xff1b;编译器将报错。为了使值类型也可为空&#xff0c;可空类型出现了&#xff0c;可空类型使用…

Extjs不错的博客

http://www.cnblogs.com/fangsui/category/372751.html http://www.cnblogs.com/WangJinYang/tag/EXT.NET/ http://www.cnblogs.com/codelove/tag/Ext.NET/转载于:https://www.cnblogs.com/anbylau2130/p/3598429.html

cvi中c语言只保留两位小数,CVI编程常见问题与错误-2012.9

CVI编程常见问题或错误1.CVI编程时&#xff0c;在程序中插入函数的方法&#xff1f;如何了解该函数隶属那个函数库&#xff1f; (3)2.如何查看或者找到一个CVI或IMAQ Vision的函数&#xff1f; (4)3.实验一不能显示曲线—采用了错误的显示控件 (5)4.实验一不能显示正弦曲线 (5)…

vector C++ 详细用法

vector是C标准模板库中的部分内容&#xff0c;它是一个多功能的&#xff0c;能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器&#xff0c;是因为它能够像容器一样存放各种类型的对象&#xff0c;简单地说&#xff0c;vector是一个能够存放任意类型的…

c#枚举类似于java_如何在Java中获得类似于C的性能

c#枚举类似于java总览 Java有许多可能很慢的领域。 但是&#xff0c;对于每个问题都有解决方案。 许多解决方案/黑客都需要解决Java的保护问题&#xff0c;但是如果您需要低水平的性能&#xff0c;还是可以的。 Java使高级编程变得越来越容易&#xff0c;但代价是使低级编程变…

c支限界算法语言n皇后问题分,n皇后问题(分析)

这道题需要用到回溯算法&#xff0c;现在在这里先简单的介绍一下这个算法&#xff1a;回溯算法也叫试探法&#xff0c;它是一种系统地搜索问题的解的方法。回溯算法的基本思想是&#xff1a;从一条路往前走&#xff0c;能进则进&#xff0c;不能进则退回来&#xff0c;换一条路…

oracle instr查询字符串

INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中&#xff0c;instr函数返回要截取的字符串在源字符串中的位置。只检索一次&#xff0c;就是说从字符的开始 到字符的结尾就结束。 语法如下&#xff1a; instr( string1, string2 [, start_position [, nth_…

android系统相机自动录像,android 调用系统相机录像并保存

1、在AndroidManifest.xml中添加如下代码tools:ignore"ProtectedPermissions" />android:authorities"${applicationId}.provider"android:name"android.support.v4.content.FileProvider"android:exported"false"android:grantUri…

【原创】jpgraph中文乱码问题的解决

php jpgraph库非常强大&#xff0c;可以在后台生成图片 后台生成在需要导出图表型报告的时候非常有用&#xff0c;当然&#xff0c;前端的可视化还是要用highcharts/echarts/anycharts等类库 比较麻烦的是中文乱码问题&#xff0c;有3个地方乱码&#xff1a; legendsetStickLab…

getstring方法android,JSON中optString和getString方法的区别

JSON中optString和getString方法的区别更新时间&#xff1a;2017年07月07日 15:18:24 投稿&#xff1a;mrroptString方法会在对应的key中的值不存在的时候返回一个空字符串&#xff0c;但是getString会抛一个JSONException 。下面通过一段代码给大家介绍JSON中optString和get…

QT+vs2010下改变可执行程序的图标

原地址&#xff1a;http://blog.163.com/tijijun126/blog/static/6820974520134209457308/ 在解决方案下面的工程里&#xff0c;点击右键-》选择【添加&#xff08;D&#xff09;】-》选择【资源&#xff08;R&#xff09;】-》选择【Icon】-》新建/导入就可以了。转载于:https…

jpanel把原本内容覆盖掉_A5:APP关键词覆盖你该了解哪些

A5:APP关键词覆盖你该了解哪些点击上方蓝字关注我们苹果ios/安卓-各大应用商店ASO优化大全IOS关键词覆盖1、苹果AppStore关键词搜索的权重排序为app标题、副标题>app关键词>app描述>宣传文本及评论(App关键词100字符)。2、如何优化100字符关键词①、根据产品用户画像分…

android音乐播放器音乐加载,Android开源音乐播放器之在线音乐列表自动加载更多...

系列文章前言当咱们的ListView数据比较多时&#xff0c;咱们通常都会选择分页显示&#xff0c;而分页显示就须要一个动做触发加载更多操做&#xff0c;一般咱们会使用上拉加载更多&#xff0c;但我以为不够人性化&#xff0c;由于用户须要手动上拉&#xff0c;因此更加人性化的…

最短路径--Floyd算法

Floyd算法 1.定义概览 Floyd-Warshall算法&#xff08;Floyd-Warshall algorithm&#xff09;是解决任意两点间的最短路径的一种算法&#xff0c;可以正确处理有向图或负权的最短路径问题&#xff0c;同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3)…

vue 打开一个iframe_Vue 之五 —— 单元测试

单元测试&#xff08;unit testing&#xff09;&#xff1a;是指对软件中的最小可测试单元进行检查和验证。代码的终极目标有两个&#xff0c;第一个是实现需求&#xff0c;第二个是提高代码质量和可维护性。单元测试是为了提高代码质量和可维护性&#xff0c;是实现代码的第二…