《iOS手势识别与定位技术详解》
立即解锁
发布时间: 2025-08-24 01:16:38 阅读量: 1 订阅数: 6 

### 《iOS 手势识别与定位技术详解》
#### 1. 点击手势识别
在 iOS 开发中,点击手势是常见的交互方式。系统对于不同点击次数的手势处理逻辑十分巧妙。当第一次点击发生时,系统不会立刻触发单击手势的动作方法,而是等待观察是否会有双击手势发生。
如果紧接着又发生了一次点击,那么双击手势识别器会认为这是它的“领地”,并触发其对应的动作,此时单击手势识别器会放弃该手势。反之,如果经过了系统认定的双击最大时间间隔,双击手势识别器会放弃,单击手势识别器则会触发其事件。
以下是定义三击和四击手势识别器的代码:
```objc
UITapGestureRecognizer *tripleTap =
[[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(tap3)] autorelease];
tripleTap.numberOfTapsRequired = 3;
tripleTap.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:tripleTap];
[doubleTap requireGestureRecognizerToFail:tripleTap];
UITapGestureRecognizer *quadrupleTap =
[[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(tap4)] autorelease];
quadrupleTap.numberOfTapsRequired = 4;
quadrupleTap.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:quadrupleTap];
[tripleTap requireGestureRecognizerToFail:quadrupleTap];
```
这里要注意,我们不需要显式地将每个手势配置为依赖于更高点击次数手势的失败。由于单击依赖于双击失败,双击依赖于三击失败,三击依赖于四击失败,所以单击自然就依赖于其他所有手势的失败。编译并运行应用程序后,无论进行单击、双击、三击还是四击,都只会显示一个标签。
#### 2. 捏合手势检测
捏合手势也是常见的手势之一,在许多应用程序(如 Mobile Safari、Mail 和 Photos)中用于缩放操作。借助 `UIPinchGestureRecognizer`,检测捏合手势变得非常简单。它是一种连续手势识别器,在捏合过程中会不断调用其动作方法。
捏合手势识别器在手势进行过程中会经历多个状态,我们主要关注 `UIGestureRecognizerStateBegan` 状态,即识别器检测到捏合动作并首次调用动作方法时的状态。此时,捏合手势识别器的 `scale` 属性始终设置为 1.0,在后续的手势过程中,该值会上下变化。我们将使用这个 `scale` 值来调整标签中文本的大小。
以下是创建 `PinchMe` 应用程序来检测捏合手势的步骤:
1. 在 Xcode 中使用基于视图的应用程序模板创建一个新项目,命名为 `PinchMe`。
2. 在 `PinchMeViewController.h` 中添加以下代码:
```objc
#import <UIKit/UIKit.h>
@interface PinchMeViewController : UIViewController {
UILabel *label;
CGFloat initialFontSize;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@property CGFloat initialFontSize;
@end
```
3. 展开 `Resources` 文件夹,双击 `PinchMeViewController.xib`。在 Interface Builder 中,将一个标签拖到视图中,调整其大小以填充整个视图,并输入一个小单词或一两个字母。将标签的对齐方式设置为居中,然后从 `File’s Owner` 图标控制拖动到标签,将其连接到 `label` 出口。
4. 在 `PinchMeViewController.m` 中添加以下代码:
```objc
#import "PinchMeViewController.h"
@implementation PinchMeViewController
@synthesize label;
@synthesize initialFontSize;
- (void)viewDidUnload {
self.label = nil;
[super viewDidUnload];
}
- (void)dealloc {
[label release];
[super dealloc];
}
- (void)viewDidLoad {
[super viewDidLoad];
UIPinchGestureRecognizer *pinch = [[[UIPinchGestureRecognizer alloc]
initWithTarget:self action:@selector(doPinch:)] autorelease];
[self.view addGestureRecognizer:pinch];
}
- (void)doPinch:(UIPinchGestureRecognizer *)pinch {
if (pinch.state == UIGestureRecognizerStateBegan) {
initialFontSize = label.font.pointSize;
} else {
label.font = [label.font fontWithSize:initialFontSize * pinch.scale];
}
}
@end
```
在 `viewDidLoad` 方法中,我们设置了一个捏合手势识别器,并告诉它在捏合发生时通过 `doPinch:` 方法通知我们。在 `doPinch:` 方法中,我们检查捏合的状态,如果是刚开始,就存储当前字体大小;否则,使用存储的初始字体大小和当前捏合比例计算新的字体大小。编译并运行应用程序,进行捏合操作时,你会看到文本大小随之变化。在模拟器中,可以通过按住 `Option` 键并在模拟器窗口中点击和拖动鼠标来模拟捏合操作。
#### 3. 创建和使用自定义手势
现在我们已经了解了如何检测最常用的 iPhone 手势,接下来就可以开始定义自己的自定义手势了。定义自定义手势是一项具有挑战性的任务。虽然基本机制并不难掌握,但难点在于如何灵活地定义手势的构成。大多数人在使用手势时并不精确,所以在定义手势时需要考虑一定的容错性。如果定义过于严格,手势可能无法正常使用;如果定义过于宽泛,会产生过多的误判,从而让用户感到沮丧。
下面我们以定义一个类似对勾的手势为例:
1. 在 Xcode 中使用基于视图的应用程序模板创建一个新项目,命名为 `CheckPlease`。
2. 从 `15 - CheckPlease` 文件夹中找到 `CGPointUtils.h` 和 `CGPointUtils.c` 文件,并将它们拖到项目的 `Other Sources` 文件夹中。
3. 在 `Classes` 文件夹中添加一个新的 Objective - C 类文件,命名为 `CheckMarkRecognizer.m`,并同时创建 `.h` 文件。在 `CheckMarkRecognizer.h` 中进行如下修改:
```objc
#impor
```
0
0
复制全文
相关推荐









