[UIView animateWithDuration:0.5 animations:^{
self.imageView.alpha = 0.0;
self.imageView.center = location;
}];
}
對連續(xù)手勢的響應
連續(xù)手勢允許應用對正在發(fā)生的手勢進行響應。例如,當用戶pinching的時候應用界面可以縮放,或者允許在屏幕內(nèi)對對象進行拖拽。
清單1-5展示了一個和用戶手勢相同角度的“旋轉”圖片,并且當用戶停止旋轉時,showGestureForRotationRecognizer:方法將被持續(xù)地調(diào)用,直到手指抬起。
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;
}];
}
}
方法每一次被調(diào)用時,圖片都drawImageForGestureRecognizer:方法被設置成不透明的。當手勢完成的時候,圖片被animateWithDuration:方法設置為透明的。showGestureForRotationRecognizer:方法通過檢查手勢識別器的狀態(tài)來確定手勢是不是完成了。這些狀態(tài)在一個有限狀態(tài)機中的手勢識別器中有更詳細的解釋。
定義手勢識別器如何交互
很多時候,當你把手勢識別器加到你的應用中的時候,你得很清楚你想讓你的識別器(或者觸摸事件代碼)如何互相交互。因此,你首先要懂一點手勢識別器的工作方式。
手勢識別器在有限狀態(tài)機中的運作
手勢識別器以預定設定好的方式從一個狀態(tài)遷移到另一個狀態(tài)。處于各個狀態(tài)時,它們能夠遷移到一個或多個可能的下一個狀態(tài),這都是基于確定的情況。狀態(tài)機的變化情況,取決于這個手勢識別器是離散的還是連續(xù)的,就像圖1-3表示的那樣。所有的手勢識別器開始于“不確定”狀態(tài)(UIGestureRecognizerStatePossible)。它們分析收到的所有的多面觸摸序列,并且在分析過程中要么是識別出來,要么識別手勢失敗。識別手勢失敗意思是手勢識別器遷移到“失敗”狀態(tài)(UIGestureRecognizerStateFailed)。

State machines for gesture recognizers
當一個離散的手勢識別器識別出來了它的手勢,這個手勢識別器會從“不確定”狀態(tài)遷移到“已識別”狀態(tài)(UIGestureRecognizerStateRecognized) 并且整個識別完成。
對于連續(xù)的手勢,當手勢識別器第一次識別出手勢時,該識別器會從“不確定”狀態(tài)遷移到“開始”狀態(tài)(UIGestureRecognizerStateRecognized)。然后,它會從“開始”狀態(tài)遷移到“改變”狀態(tài)(UIGestureRecognizerStateChanged),并且在手勢發(fā)生時持續(xù)地從“改變”改變遷移到“改變”狀態(tài)。當用戶的最后一個手指從視圖上舉起離開的時候,手勢識別器會遷移到“結束”狀態(tài)(UIGestureRecognizerStateEnded)。這個手勢識別至此完成。注意,“結束”狀態(tài)其實是“已識別”狀態(tài)的同義詞。
如果一個連續(xù)手勢的識別器判斷確定當前手勢不再符合期望的模式,那么它也可以從“改變”狀態(tài)遷移到“取消”狀態(tài)(UIGestureRecognizerStateCancelled)。
手勢識別器每次改變狀態(tài)時,它會向它的目標發(fā)送一條消息,除非它遷移到了“失敗”狀態(tài)或“取消”狀態(tài)。因此,一個離散的手勢識別器在它從“不確定”遷移到“已識別”狀態(tài)時,只會發(fā)送一條動作消息。一個連續(xù)的手勢識別器在它改變狀態(tài)時,會發(fā)送很多條動作消息。