在Xcode的IB中,添加一个手势识别器和添加一个任何一个对象到界面上方式相同——从对象库中拖拽一个手势识别器到一个视图上。你做完这些以后,手势识别器会自动地绑定到这个视图上。你可以检查你的手势识别器绑定到了哪个视图,并且,如果必要的话你可以改变nib文件中的连接。
创建完手势识别器对象之后,你需要创建并连接一个动作方法。这个方法将在连接的手势识别器识别出它的手势时被调用。如果你需要在这个动作方法之外引用这个手势识别器,你应该为这个手势识别器再创建并连接一个接口。你的代码应和清单1-1很像。
Listing 1-1 Adding a gesture recognizer to your app with Interface Builder
[email protected] APLGestureRecognizerViewController ()
[email protected] (nonatomic, strong) IBOutlet UITapGestureRecognizer *tapRecognizer;
[email protected]
[email protected]
- (IBAction)displayGestureForTapRecognizer:(UITapGestureRecognizer *)recognizer
// Will implement method later...
}
[email protected]
使用代码添加手势识别器
你也可以通过alloc和init一个具体的UIGestureRecognizer子类(例如UIPinchGestureRecognizer)的实例。当你初始化手势识别器的时候,得指定一个目标对象和一个动作选择器(selector),像清单1-2那样。目标对象常常是视图的视图控制器。
如果通过代码建立一个手势识别器,你需要使用addGestureRecognizer: 方法把它绑定到视图上。清单1-2创建了一个独立的点击手势识别器,指定了需要识别的手势是一次点击,然后把手势识别器对象绑定到了一个视图上。典型的做法是,你在视图控制器的viewDidLoad方法中创建手势识别器,如清单1-2展示。
Listing 1-2 Creating a single tap gesture recognizer programmatically
- (void)viewDidLoad {
[super viewDidLoad];
// Create and initialize a tap gesture
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(respondToTapGesture:)];
// Specify that the gesture must be a single tap
tapRecognizer.numberOfTapsRequired = 1;
// Add the tap gesture recognizer to the view
[self.view addGestureRecognizer:tapRecognizer];
// Do any additional setup after loading the view, typically from a nib
}
对离散手势的响应
你在创建一个手势识别器的时候会把识别器连接到一个动作方法上。使用这个方法对你的手势识别器进行响应。清单1-3提供一个对离散手势进行响应的例子。当用户点击手势识别器绑定的视图时,视图控制器显示一张写有“Tap.”的图片。showGestureForTapRecognizer:方法会确定视图上手势的位置,这个位置信息来自识别器的locationInView属性,然后把图片在这个位置上显示出来。
Note:下面的三个代码案例都来自于Simple Gesture Recognizers案例项目,你可以查看更多的上下文。
Listing 1-3 Handling a double tap gesture
- (IBAction)showGestureForTapRecognizer:(UITapGestureRecognizer *)recognizer {
// Get the location of the gesture
CGPoint location = [recognizer locationInView:self.view];
// Display an image view at that location
[self drawImageForGestureRecognizer:recognizer atPoint:location];
// Animate the image view so that it fades out
[UIView animateWithDuration:0.5 animations:^{
self.imageView.alpha = 0.0;
}];
}
每一个手势识别器都有自己的属性集合。例如,在清单1-4中,showGestureForSwipeRecognizer:方法使用了swipe手势识别器的方向属性来确定用户是往左滑还是往右滑。然后,它使用这个值来使图片从滑动方向逐渐消失掉。
Listing 1-4 Responding to a left or right swipe gesture
// Respond to a swipe gesture
- (IBAction)showGestureForSwipeRecognizer:(UISwipeGestureRecognizer *)recognizer {
// Get the location of the gesture
CGPoint location = [recognizer locationInView:self.view];
// Display an image view at that location
[self drawImageForGestureRecognizer:recognizer atPoint:location];
// If gesture is a left swipe, specify an end location
// to the left of the current location
if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
location.x -= 220.0;
} else {
location.x += 220.0;
}
// Animate the image view in the direction of the swipe as it fades out