iOS事件处理指南-手势识别器

  在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