iphone開發 用戶點擊,觸摸和手勢識別 解析

用戶對屏幕(人機交互)的全部操做均可稱爲事件。事件包括用戶點擊,觸摸和手勢識別等。

一:UIView及UIViewController都繼承自UIResponder類,而具備在屏幕上顯示功能的類及其控制器類(UIControl)也都繼承自UIView,因此他們都時響應者(即全部視圖和所由控件都是響應者)。

內容結構圖:


二:響應着鏈:事件是向上傳遞的(這點相似於java中的異常處理:throw),噹噹前響應者處理不了事件的時,他會將此事件傳遞給他的父視圖,逐級向更高一層(下一個對象)傳遞。

若是窗口處理不了當前事件,此事件將會被傳遞到應用程序的UIApplication實例。若是仍是處理不了,此事件將進入睡眠狀態。

響應者鏈圖:


轉發事件:從上面能夠看到,事件是在逐個對象間的傳遞,當視圖(如:表視圖)不包含動做事件(如:輕掃手勢)時,可能不會執行傳遞工做,這樣其餘對象將沒法得到響應,阻止了其餘視圖的手勢識別。這時就須要手動去傳遞:在下一個響應者上調用相同的方法來傳遞該對象,
[plain] view plain copy
  1. -(void)<span style="background-color: rgb(153, 255, 153);">responder</span>:(UIEvent*)event{  
  2. //若是可處理傳遞事件,執行此句:  
  3. [self handleEvent:event ];  
  4.   
  5. //不然手動傳遞到下一個響應者(遞歸)  
  6. [self.nextResponder <span style="background-color: rgb(153, 255, 153);">responder</span>:event ];  
  7. }  

三:  4個通知手勢的方法:

1.開始觸摸:
[plain] view plain copy
  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.     [super touchesMoved:touches withEvent:event];  
  3.     //touches :動做的數量()  每一個對象都是一個UITouch對象,而每個事件均可以理解爲一個手指觸摸。  
  4.     //獲取任意一個觸摸對象  
  5.     UITouch *touch = [touches anyObject];  
  6.     //得到觸摸對象的點擊數量,只捕捉一個觸摸對象的點擊。  
  7.     NSInteger numTaps=[touch tapCount];  
  8.     //得到觸摸對象的數量  
  9.     NSInteger numTouchs=[touches count];  
  10.       
  11.     //觸摸對象的位置  
  12.     CGPoint previousPoint = [touch previousLocationInView:self.view];  
2.移動:
[plain] view plain copy
  1. <pre name="code" class="plain">- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.    
  3. }</pre>  
  4. <pre></pre>  
  5. 3.離開:  
  6. <pre></pre>  

[plain] view plain copy
  1. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.    
  3. }  

4.取消:  電話呼入等中斷手勢時,會調用此方法。
[plain] view plain copy
  1. - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.    
  3. }  

四:手勢識別器(UIGestureRecognizer):能夠理解成一個容器,裏面可添加它的子類(如:捏合(UIPinchGestureRecognizer),輕掃(UISwiperGestureRecognizer),點擊(UITapGestureRecognizer)),這些子類都是封裝好的,可響應屏幕上的事件進行處理。固然也可自定義手勢識別器的子類,來響應須要的事件,這樣顯得更靈活些。

1.調用系統的手勢識別器 以捏合爲例:

[plain] view plain copy
  1. - (void)viewDidLoad {  
  2.     [super viewDidLoad];  
  3.     //實例化捏合手勢識別器,將實例好的手勢識別器對象做爲實參傳遞到doPinch:。  
  4.     UIPinchGestureRecognizer *pinch = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(doPinch:)] autorelease];  
  5.     //將實例化捏合手勢識別器加入視圖識別器中。  
  6.     [self.view addGestureRecognizer:pinch];  
  7. }  
  8.   
  9. - (void)doPinch:(UIPinchGestureRecognizer *)pinch {  
  10.     //若是開始觸發  
  11.     if (pinch.state == UIGestureRecognizerStateBegan) {  
  12.       CGFloat  initialFontSize = label.font.pointSize;  
  13.     } else {  
  14.         //按照捏合比例擴大或縮小  
  15.         label.font = [label.font fontWithSize:initialFontSize * pinch.scale];  
  16.     }  
  17. }  

2.自定義手勢識別器:

自定義MyGestureRecognizerView。

MyGestureRecognizerView.hjava

[plain] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface MyGestureRecognizerView : UIGestureRecognizer  
  4.   
  5. @end  

MyGestureRecognizerView.m
[plain] view plain copy
  1. #import "MyGestureRecognizerView.h"  
  2.   
  3. @implementation MyGestureRecognizerView  
  4. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  5.     [super touchesBegan:touches withEvent:event];  
  6.       
  7.     //能夠填寫本身所須要的識別機制。。。。。。  
  8.       
  9.     //獲取任意一個觸摸對象  
  10.     UITouch *touch = [touches anyObject];  
  11.     //得到觸摸對象的點擊數量,只捕捉一個觸摸對象的點擊。  
  12.      NSInteger numTaps=[touch tapCount];  
  13.     //得到觸摸對象的數量  
  14.      NSInteger numTouchs=[touches count];  
  15.       
  16.     //觸摸對象的位置  
  17.     CGPoint previousPoint = [touch previousLocationInView:self.view];  
  18.       
  19.     }  
  20.   
  21. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  
  22.     [super touchesMoved:touches withEvent:event];  
  23.       
  24.    //能夠填寫本身所須要的識別機制。。。。。。。  
  25. }  
  26. @end  

在主視圖控制器中:

HelloViewController.h
[plain] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface HelloViewController : UIViewController  
  4.   
  5. @end  

HelloViewController.m

[plain] view plain copy
  1. #import "HelloViewController.h"  
  2. #import "MyGestureRecognizerView.h"  
  3. @interface HelloViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation HelloViewController  
  8.   
  9. - (void)viewDidLoad  
  10. {  
  11.       
  12.     MyGestureRecognizerView *mygest=[[MyGestureRecognizerView alloc] initWithTarget:self action:@selector(doit:)];  
  13.       
  14.     [self.view addGestureRecognizer:mygest];  
  15.     [super viewDidLoad];  
  16.     // Do any additional setup after loading the view, typically from a nib.  
  17. }  
  18.   
  19. -(void)doit:(MyGestureRecognizerView *)my{  
  20.       
  21. }  
  22.   
  23. - (void)viewDidUnload  
  24. {  
  25.     [super viewDidUnload];  
  26.     // Release any retained subviews of the main view.  
  27. }  
  28.   
  29. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  30. {  
  31.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  32. }  
  33.   
  34. @end 
相關文章
相關標籤/搜索