各种触摸手势

轻按(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;所以不建议关闭宝塔面板…

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

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

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

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

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…

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;是实现代码的第二…

Hibernate如何存储二级缓存条目

介绍 使用数据库访问抽象层的好处是可以透明地实现缓存&#xff0c;而不会泄漏到业务逻辑代码中 。 Hibernate Persistence Context充当事务后写式高速缓存 &#xff0c;将实体状态转换转换为DML语句。 持久性上下文充当逻辑事务存储&#xff0c;并且每个Entity实例最多可以具…

file协议访问linux,Mozilla Firefox for Android 'file'协议未授权访问漏洞(CVE-2014-1501)

发布日期&#xff1a;2014-03-18更新日期&#xff1a;2014-04-02受影响系统&#xff1a;Mozilla Firefox < 28.0描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 66424CVE(CAN) ID: CVE-2014-1501Firefox是…

dcdc芯片效率不高的原因_半导体厂商如何做芯片的出厂测试?

本文来源于知乎&#xff0c;已获作者授权&#xff0c;谢谢。作者&#xff1a;温戈链接&#xff1a;https://www.zhihu.com/question/20584576/answer/1538640891知乎网友提问&#xff1a;半导体厂商如何做芯片的出厂测试&#xff1f;例如 Intel 的 CPU、手机处理器&#xff0c;…

魅族android n内测报名,不再万年Android 5.0! Flyme安卓N内测招募开启

科客点评&#xff1a;恰逢Flyme五周年庆&#xff0c;这算的是给煤油们最大的礼物。近日&#xff0c;魅族Flyme系统非常活跃&#xff0c;为国内友商操碎了心&#xff0c;为此适配了一众友商热门机型&#xff0c;刷了不少存在感&#xff0c;但这显然不是魅族要搞的“大事情”。6月…

db2数据库连接数 linux_介绍一款数据库管理工具DBeaver

之前连接MySQL一直使用的是navicate&#xff0c;挺好用的&#xff0c;不过是个付费软件&#xff0c;一直想找一款免费开源的软件来替代。今天偶然间发现DBeaver&#xff0c;这是一款基于java开发的数据库工具&#xff0c;而且可以支持Windows、Linux、MacOS多个平台&#xff0c…

jqgrid mvc_jqGrid,REST,AJAX和Spring MVC集成

jqgrid mvc两年多以前&#xff0c;我写了一篇关于如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代…

ChronicleMap –具有堆外内存的Java体系结构

我的上一篇文章是在几周前写的&#xff0c;在收到一些有效的反馈后&#xff0c;我想澄清几点&#xff0c;作为本文的序言。 “ 使用零垃圾创建数百万个对象 ”的主要收获应该是&#xff0c;使用Chronicle&#xff0c;在编写Java程序时&#xff0c;您不会“局限于”使用jvm分配…

下列不属于html5语义元素,HTML5 新的语义元素

HTML5 提供了新的语义元素来明确一个Web页面的不同部分:HTML5中新的语义元素HTML5 元素标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。根据W3C HTML5文档: section 包含了一组内容及其标题。WWFThe World Wide Fund for Nature (WWF) is....HTM…

干加个偏旁可以变成什么字_面试官:“干”字加一笔,变成什么字?回答王和午字不对...

随着大学生的增多&#xff0c;如今的求职者进入职场&#xff0c;想到一份心仪的工作&#xff0c;最让人头疼的就是面试&#xff0c;越来越多的企业都需要全能型的人才&#xff0c;从而在面试的时候不仅要考核专业知识&#xff0c;面试官还要费尽心思出各种各样的题来考验求职者…

Oracle研学-查询

学自B站黑马程序员 1.单表查询 //查询水表编号为 30408 的业主记录 select * from T_OWNERS where watermeter30408 //查询业主名称包含“刘”的业主记录 select * from t_owners where name like %刘% //查询业主名称包含“刘”的并且门牌号包含 5 的业主记录 select * from…