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

  [UIView animateWithDuration:0.5 animations:^{

  self.imageView.alpha = 0.0;

  self.imageView.center = location;

  }];

  }

  对连续手势的响应

  连续手势允许应用对正在发生的手势进行响应。例如,当用户pinching的时候应用界面可以缩放,或者允许在屏幕内对对象进行拖拽。

  清单1-5展示了一个和用户手势相同角度的“旋转”图片,并且当用户停止旋转时,showGestureForRotationRecognizer:方法将被持续地调用,直到手指抬起。

  Listing 1-5 Responding to a rotation gesture

  // Respond to a rotation gesture

  - (IBAction)showGestureForRotationRecognizer:(UIRotationGestureRecognizer *)recognizer {

  // Get the location of the gesture

  CGPoint location = [recognizer locationInView:self.view];

  // Set the rotation angle of the image view to

  // match the rotation of the gesture

  CGAffineTransform transform = CGAffineTransformMakeRotation([recognizer rotation]);

  self.imageView.transform = transform;

  // Display an image view at that location

  [self drawImageForGestureRecognizer:recognizer atPoint:location];

  // If the gesture has ended or is canceled, begin the animation

  // back to horizontal and fade out

  if (([recognizer state] == UIGestureRecognizerStateEnded) || ([recognizer state] == UIGestureRecognizerStateCancelled)) {

  [UIView animateWithDuration:0.5 animations:^{

  self.imageView.alpha = 0.0;

  self.imageView.transform = CGAffineTransformIdentity;

  }];

  }

  }

  方法每一次被调用时,图片都drawImageForGestureRecognizer:方法被设置成不透明的。当手势完成的时候,图片被animateWithDuration:方法设置为透明的。showGestureForRotationRecognizer:方法通过检查手势识别器的状态来确定手势是不是完成了。这些状态在一个有限状态机中的手势识别器中有更详细的解释。

  定义手势识别器如何交互

  很多时候,当你把手势识别器加到你的应用中的时候,你得很清楚你想让你的识别器(或者触摸事件代码)如何互相交互。因此,你首先要懂一点手势识别器的工作方式。

  手势识别器在有限状态机中的运作

  手势识别器以预定设定好的方式从一个状态迁移到另一个状态。处于各个状态时,它们能够迁移到一个或多个可能的下一个状态,这都是基于确定的情况。状态机的变化情况,取决于这个手势识别器是离散的还是连续的,就像图1-3表示的那样。所有的手势识别器开始于“不确定”状态(UIGestureRecognizerStatePossible)。它们分析收到的所有的多面触摸序列,并且在分析过程中要么是识别出来,要么识别手势失败。识别手势失败意思是手势识别器迁移到“失败”状态(UIGestureRecognizerStateFailed)。

State machines for gesture recognizers

  State machines for gesture recognizers

  当一个离散的手势识别器识别出来了它的手势,这个手势识别器会从“不确定”状态迁移到“已识别”状态(UIGestureRecognizerStateRecognized) 并且整个识别完成。

  对于连续的手势,当手势识别器第一次识别出手势时,该识别器会从“不确定”状态迁移到“开始”状态(UIGestureRecognizerStateRecognized)。然后,它会从“开始”状态迁移到“改变”状态(UIGestureRecognizerStateChanged),并且在手势发生时持续地从“改变”改变迁移到“改变”状态。当用户的最后一个手指从视图上举起离开的时候,手势识别器会迁移到“结束”状态(UIGestureRecognizerStateEnded)。这个手势识别至此完成。注意,“结束”状态其实是“已识别”状态的同义词。

  如果一个连续手势的识别器判断确定当前手势不再符合期望的模式,那么它也可以从“改变”状态迁移到“取消”状态(UIGestureRecognizerStateCancelled)。

  手势识别器每次改变状态时,它会向它的目标发送一条消息,除非它迁移到了“失败”状态或“取消”状态。因此,一个离散的手势识别器在它从“不确定”迁移到“已识别”状态时,只会发送一条动作消息。一个连续的手势识别器在它改变状态时,会发送很多条动作消息。