iOS开发:手势识别与定位功能详解
立即解锁
发布时间: 2025-08-20 01:38:28 阅读量: 1 订阅数: 6 


iOS 7开发入门:探索iOS SDK
### iOS开发:手势识别与定位功能详解
#### 1. 手势识别基础
在iOS开发中,手势识别是提升用户交互体验的重要部分。每个`UITouch`对象都能记录其在视图中的当前位置和先前位置。为了比较角度,我们需要存储用户上次触摸屏幕时的当前点和先前点,以便比较当前线条和先前线条的角度。
同时,我们还声明一个实例变量来记录用户手指拖动的距离。如果手指拖动距离不足10像素(`kMinimumCheckMarkLength`定义的值),那么即使角度在合适范围内,也不判定为有效手势,这样可以避免大量误判。
#### 2. 自定义手势识别方法
接下来,我们添加两个方法来处理发送给手势识别器的触摸事件:
```objc
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
lastPreviousPoint = point;
lastCurrentPoint = point;
lineLengthSoFar = 0.0;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint previousPoint = [touch previousLocationInView:self.view];
CGPoint currentPoint = [touch locationInView:self.view];
CGFloat angle = angleBetweenLines(lastPreviousPoint,
lastCurrentPoint,
previousPoint,
currentPoint);
if (angle >= kMinimumCheckMarkAngle && angle <= kMaximumCheckMarkAngle
&& lineLengthSoFar > kMinimumCheckMarkLength) {
self.state = UIGestureRecognizerStateEnded;
}
lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
lastPreviousPoint = previousPoint;
lastCurrentPoint = currentPoint;
}
```
这两个方法首先调用了父类的实现,这在`UIGestureRecognizer`子类中是必要的,确保父类和我们的代码对事件有相同的了解。
在`touchesBegan:withEvent:`方法中,我们确定用户当前触摸的点,并将其存储在`lastPreviousPoint`和`lastCurrentPoint`中,同时将跟踪的线条长度重置为0。
在`touchesMoved:withEvent:`方法中,我们计算当前触摸的先前位置到当前位置的线条与`lastPreviousPoint`和`lastCurrentPoint`所存储的两点之间线条的角度。如果角度在可接受范围内,并且手指拖动距离足够,我们就判定识别到了对勾手势。然后,我们计算触摸位置和先前位置之间的距离,并更新`lineLengthSoFar`以及`lastPreviousPoint`和`lastCurrentPoint`的值。
#### 3. 连接手势识别器到视图
完成自定义手势识别器后,我们需要将其连接到视图。具体步骤如下:
1. 打开`BIDViewController.m`文件,在文件顶部添加以下代码:
```objc
#import "BIDViewController.h"
#import "BIDCheckMarkRecognizer.h"
@interface BIDViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
```
这里我们导入了自定义手势识别器的头文件,并添加了一个指向标签的输出口,用于在识别到对勾手势时通知用户。
2. 选择`Main.storyboard`来编辑GUI。从库中添加一个标签到视图,使其紧贴顶部和左侧蓝色参考线。调整其大小,使其从左侧蓝色参考线延伸到右侧蓝色参考线,并将其对齐方式设置为居中。然后,从视图控制器图标按住`Control`键拖动到该标签,将其连接到标签输出口,最后双击标签删除其文本。
3. 切换回`BIDViewController.m`文件,在`@implementation`部分添加以下代码:
```objc
@implementation BIDViewController
- (void)doCheck:(BIDCheckMarkRecognizer *)check
{
self.label.text = @"Checkmark";
[self performSelector:@selector(eraseLabel)
withObject:nil afterDelay:1.6];
}
- (void)eraseLabel
{
self.label.text = @"";
}
```
这些代码提供了一个动作方法,用于连接手势识别器,当识别到对勾手势时,标签会显示“Checkmark”,并在1.6秒后清除文本。
4. 编辑`viewDidLoad`方法,添加以下代码:
```objc
- (void)viewDidLoad
{
```
0
0
复制全文
相关推荐








