你們都知道,蘋果的設備,無論是mac機器仍是iPhone或iad,都支持多點觸控,進而延伸了多種手勢識別的功能。這爲用戶帶來了很大的便攜性和多樣靈活性,極大的方便了用戶的使用。足以見手勢識別(GestureRecognizers)在開發中也有舉足輕重的做用。ios
在iOS 4之前,手勢識別由開發人員負責。ui
主要使用的是由UIResponder而來的以下4種方式:spa
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event對象
這每每須要進行復雜的數學運算才能甄別不用的手勢,蘋果意識到這種狀況的複雜性和手勢對iPhone用戶界面的重要性以後,在iOS4中加入了UIGestureRecognizer類,使開發者更容易實現各類手勢的識別。繼承
UIGestureRecognizer類是繼承自Nsobject的抽象類,它派生的6個主要子類分別詮釋了不一樣的手勢識別。ip
這些手勢識別器必需和視圖經過addGestureRecognizer:方法聯繫在一塊兒。識別器必需指定一個響應方法以便發生指定手勢時進行調用。removeGestureRecognizer:方法能夠將識別器從視圖中移出,方法參數指定要移除的識別器.開發
iOS 4 的手勢識別器在偵測到某個手勢發生時,使用目標-動做模型去通知應用程序。當一個識別器被建立以後,只要有對應的手勢發生,就會調用建立時指定的方法。rem
手勢分爲「連續手勢」和「不連續手勢」兩種。「不連續手勢」只會致使調用響應方法一次。「輕擊」(包括多擊)僅僅會觸發一次響應方法。而「輕掃」、「平移」、「旋轉」、「捏合」則是連續手勢,它們會接二連三地調用響應方法直到手勢結束。get
每一個手勢響應方法都會被傳入一個UIGestureRecognizer* sender對象,從中能夠獲取到和手勢有關的信息。例如,對於「捏合」手勢,能夠經過這個參數獲取縮放係數、捏合速度。對於「轉動」手勢,則能夠得到轉動的次數及速度。數學
輕擊手勢使用UITapGestureRecognizer類進行識別。在alloc和init時必需指定一個手勢觸發時調用的方法引用(即selector選擇器)。使用numberOfTapsRequired屬性能夠定義輕擊必需被連續操做的次數。如如下代碼所示,當識別器偵測到連續輕擊2次時,將觸發tapDetected:方法。
-(void) tapGestureRecognizeTest
{
UITapGestureRecognizer *doubleTap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDeteted:)];
doubleTap.numberOfTapsRequired=2;
[self.parentUiView addGestureRecognizer:doubleTap];
[doubleTap release];
}
-(IBAction)tapDeteted:(UIGestureRecognizer *)sender
{
NSLog(@"雙擊手勢");
}
捏合手勢使用UIPinchGestureRecognizer類識別。例如:
-(void) pinchGestureRecongnizeTest
{
UIPinchGestureRecognizer *pinshGesture=[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinshDeteted:)];
[self.parentUiView addGestureRecognizer:pinshGesture];
[pinshGesture release];
}
-(IBAction)pinshDeteted:(UIGestureRecognizer *)sender
{
NSLog(@"此觸摸手勢爲%@",@"捏合手勢");
}
轉動手勢使用UIRotationGestureRecognizer類。
UIRotationGestureRecognizer *rotationRecognizer =
[[UIRotationGestureRecognizer alloc]
initWithTarget:self
action:@selector(rotationDetected:)];
[self.view addGestureRecognizer:rotationRecognizer];
[rotationRecognizer release];
平移手勢使用UIPanGestureRecognizer 類。平移手勢是最基本的連續手勢。例如手指在屏幕上隨意亂劃能夠被識別爲平移或拖拽操做:
UIRotationGestureRecognizer *panRecognizer =
[[UIPanGestureRecognizer alloc]
initWithTarget:self
action:@selector(panDetected:)];
[self.view addGestureRecognizer:panRecognizer];
[panRecognizer release];
若是輕掃和平移都添加在同一個view中,那麼極可能大部分輕掃手勢都會被識別爲平移。並且若是兩種手勢被添加到同一個view時,會產生一個警告。
輕掃手勢使用 UISwipeGestureRecognizer 類。全部的輕掃都將被識別,或者你能夠指定只偵測方向爲如下常量的輕掃:
若是不指定direction屬性,默認只偵測方向爲右的輕掃。如下代碼設置只偵測向上輕掃:
UISwipeGestureRecognizer *swipeRecognizer =
[[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(swipeDetected:)];
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipeRecognizer];
[swipeRecognizer release];
長按手勢使用 UILongPressGestureRecognizer 類。這個手勢須要指定長按的時間,觸摸的次數,點擊的次數以及在觸摸過程當中是否容許移動。這些選項分別由minimumPressDuration, numberOfTouchesRequired, numberOfTapsRequired 和allowableMovement 屬性指定。如下代碼使識別器只偵測單指長按3秒以上的手勢。allowableMovement未指定,默認是容許10個像素的移動:
UILongPressGestureRecognizer *longPressRecognizer =
[[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(longPressDetected:)]; longPressRecognizer.minimumPressDuration = 3;
longPressRecognizer.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:longPressRecognizer];
[longPressRecognizer release];
注:ios模擬器使用捏合手勢時,按住option鍵。而後結合鼠標模擬。 觸摸手勢說明: (1)右鍵按住+移動鼠標向左=放大; (2)右鍵按住+移動鼠標向右=縮小; (3)右鍵按住+移動鼠標向上=前傾; (4)右鍵按住+移動鼠標向下=後傾