博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用iOS4的GestureRecognizers识别手势(Xcode4)
阅读量:5889 次
发布时间:2019-06-19

本文共 3879 字,大约阅读时间需要 12 分钟。

在这章“在iOS4中侦测iPhone屏幕上的动作”中,我们看到了如何跟踪iPhone屏幕上的手指动作。实际上,所有的应用程序都需要处理“手势”中的某些动作。例如手指“扫过”屏幕,可能会导致新视图的显示。同样,“捏合”手势通常被应用程序定义为图片或视图的缩放操作。

在iOS 4以前,手势识别由开发人员负责,这往往需要进行复杂的数学运算。苹果意识到这种情况的复杂性和手势对iPhone用户界面的重要性之后,在iOS4中加入了UIGestureRecognizer类,使开发者更容易实现各种手势的识别。

本章的目的,是对在iOS4中如何进行手势识别进行一个初步的认识。下一章将是一个关于iOS 4手势识别的实例。

 

UIGestureRecognizer 类

 

该类拥有一系列子类,每个子类都用于识别某类指定的手势。它们是:

  • UITapGestureRecognizer – “轻击”手势。可以配置为“单击”和“连击”的识别。
  • UIPinchGestureRecognizer –“捏合”手势。该手势通常用于缩放视图或改变可视组件的大小。
  • UIPanGestureRecognizer – “平移”手势。识别拖拽或移动动作。
  • UISwipeGestureRecognizer – “轻扫”手势。当用户从屏幕上划过时识别为该手势。可以指定该动作的方向(上、下、左、右)。
  • UIRotationGestureRecognizer – “转动”手势。用户两指在屏幕上做相对环形运动。
  • UILongPressGestureRecognizer – “长按”手势。使用1指或多指触摸屏幕并保持一定时间。

这些手势识别器必需和视图通过addGestureRecognizer:方法联系在一起。识别器必需指定一个响应方法以便发生指定手势时进行调用。removeGestureRecognizer:方法可以将识别器从视图中移出,方法参数指定要移除的识别器。

 

识别器响应消息

 

iOS 4 的手势识别器在侦测到某个手势发生时,使用目标-动作模型去通知应用程序。当一个识别器被创建之后,只要有对应的手势发生,就会调用创建时指定的方法。

 

连续和不连续手势

 

手势分为“连续手势”和“不连续手势”两种。“不连续手势”只会导致调用响应方法一次。“轻击”(包括多击)仅仅会触发一次响应方法。而“轻扫”、“平移”、“旋转”、“捏合”则是连续手势,它们会连续不断地调用响应方法直到手势结束。

 

从手势中获取数据

 

每个手势响应方法都会被传入一个UIGestureRecognizer* sender对象,从中可以获取到和手势有关的信息。例如,对于“捏合”手势,可以通过这个参数获取缩放系数、捏合速度。对于“转动”手势,则可以获得转动的次数及速度。

 

识别轻击手势

 

轻击手势使用UITapGestureRecognizer类进行识别。在alloc和init时必需指定一个手势触发时调用的方法引用(即selector选择器)。使用numberOfTapsRequired属性可以定义轻击必需被连续操作的次数。如以下代码所示,当识别器侦测到连续轻击2次时,将触发tapDetected:方法。

UITapGestureRecognizer *doubleTap=
           [[UITapGestureRecognizer alloc]
           initWithTarget:self
            action:@selector(tapDetected:)]; doubleTap.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:doubleTap];
[doubleTap release];

 

手势的响应方法tapDetected:可能定义为如下代码:

- (IBAction)tapDetected:(UIGestureRecognizer *)sender {
// Code to respond to gesture here
}
 

识别捏合手势

 

 捏合手势使用UIPinchGestureRecognizer类识别。例如:

UIPinchGestureRecognizer *pinchRecognizer =
        [[UIPinchGestureRecognizer alloc]
       initWithTarget:self
        action:@selector(pinchDetected:)];
[self.view addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];
 

识别转动手势

 

转动手势使用UIRotationGestureRecognizer类。

UIRotationGestureRecognizer *rotationRecognizer =
      [[UIRotationGestureRecognizer alloc]
      initWithTarget:self
       action:@selector(rotationDetected:)];
[self.view addGestureRecognizer:rotationRecognizer];
[rotationRecognizer release];
 

识别平移手势

 

平移手势使用UIPanGestureRecognizer 类。平移手势是最基本的连续手势。例如手指在屏幕上随意乱划可以被识别为平移或拖拽操作:

UIRotationGestureRecognizer *panRecognizer =
       [[UIPanGestureRecognizer alloc]
     initWithTarget:self
       action:@selector(panDetected:)];
[self.view addGestureRecognizer:panRecognizer];
[panRecognizer release];

如果轻扫和平移都添加在同一个view中,那么很可能大部分轻扫手势都会被识别为平移。而且如果两种手势被添加到同一个view时,会产生一个警告。

 

识别轻扫手势

 

轻扫手势使用 UISwipeGestureRecognizer 类。所有的轻扫都将被识别,或者你可以指定只侦测方向为以下常量的轻扫:

  • UISwipeGestureRecognizerDirectionRight
  • UISwipeGestureRecognizerDirectionLeft
  • UISwipeGestureRecognizerDirectionUp
  • USwipeIGestureRecognizerDirectionDown

如果不指定direction属性,默认只侦测方向为右的轻扫。以下代码设置只侦测向上轻扫:

UISwipeGestureRecognizer *swipeRecognizer =
        [[UISwipeGestureRecognizer alloc]
      initWithTarget:self
        action:@selector(swipeDetected:)];
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipeRecognizer];
[swipeRecognizer release];
 

识别长按手势

 

长按手势使用 UILongPressGestureRecognizer 类。这个手势需要指定长按的时间,触摸的次数,点击的次数以及在触摸过程中是否允许移动。这些选项分别由minimumPressDuration, numberOfTouchesRequired, numberOfTapsRequired 和allowableMovement 属性指定。以下代码使识别器只侦测单指长按3秒以上的手势。allowableMovement未指定,默认是允许10个像素的移动:

UILongPressGestureRecognizer *longPressRecognizer =
       [[UILongPressGestureRecognizer alloc]
     initWithTarget:self
       action:@selector(longPressDetected:)]; longPressRecognizer.minimumPressDuration = 3;
longPressRecognizer.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:longPressRecognizer];
[longPressRecognizer release];
 

小结

 

这一章,我们对手势识别器进行了一个大体的介绍,并列举了一些侦测各种常见手势的示例代码。下一章,我们将通过一个示例按部就班地演示如何使用这些知识

转载地址:http://jyfsx.baihongyu.com/

你可能感兴趣的文章
EL 表达式小结
查看>>
内部排序
查看>>
jQuery EasyUI API 中文文档 - 组合(Combo)
查看>>
10个关于 Dropbox 的另类功用(知乎问答精编)[还是转来了]
查看>>
Oracle体系结构
查看>>
用Modelsim仿真QII FFT IP核的时候出现的Error: Illegal target for defparam
查看>>
javascript Error对象详解
查看>>
nc 局域网聊天+文件传输(netcat)
查看>>
C++它 typedef void *HANDLE
查看>>
Git常用命令
查看>>
Linux下查看MySQL的安装路径
查看>>
C#获取磁盘列表与信息
查看>>
mysql学习笔记4---mysql 复制---源代码
查看>>
Linux设备驱动之semaphore机制【转】
查看>>
每天一个linux命令(25):linux文件属性详解
查看>>
【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
查看>>
HDU 3280 Equal Sum Partitions(二分查找)
查看>>
第一个之出现一次的字符
查看>>
go微服务框架go-micro深度学习(三) Registry服务的注册和发现
查看>>
expectFAQ(附一个python批量任务脚本)--持续更新
查看>>