[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
当一个离散的手势识别器识别出来了它的手势,这个手势识别器会从“不确定”状态迁移到“已识别”状态(UIGestureRecognizerStateRecognized) 并且整个识别完成。
对于连续的手势,当手势识别器第一次识别出手势时,该识别器会从“不确定”状态迁移到“开始”状态(UIGestureRecognizerStateRecognized)。然后,它会从“开始”状态迁移到“改变”状态(UIGestureRecognizerStateChanged),并且在手势发生时持续地从“改变”改变迁移到“改变”状态。当用户的最后一个手指从视图上举起离开的时候,手势识别器会迁移到“结束”状态(UIGestureRecognizerStateEnded)。这个手势识别至此完成。注意,“结束”状态其实是“已识别”状态的同义词。
如果一个连续手势的识别器判断确定当前手势不再符合期望的模式,那么它也可以从“改变”状态迁移到“取消”状态(UIGestureRecognizerStateCancelled)。
手势识别器每次改变状态时,它会向它的目标发送一条消息,除非它迁移到了“失败”状态或“取消”状态。因此,一个离散的手势识别器在它从“不确定”迁移到“已识别”状态时,只会发送一条动作消息。一个连续的手势识别器在它改变状态时,会发送很多条动作消息。