[1]事件的基本概念
UIEvent:事件,是由硬件捕捉的一個表示用戶操作設備的對象。
分三類:觸摸事件、晃動事件、遠程控制事件
觸摸事件:用戶通過觸摸設備屏幕操作對象、輸入數據。支持多點觸摸,包含1個到多個觸摸點
UIView支持觸摸事件(因為繼承於UIResponder),而且支持多點觸摸。
需要定義UIView子類,實現觸摸相關的方法。
touches..began、
touches..moved、
touches...ended、
touches..canceled
[2]手勢:有規律的觸摸。
UITouch代表觸摸在屏幕上的一根手指。可以獲取觸摸時間和觸摸位置。
如何獲取touch對象。touches集合中包含了視圖上的所有?勢
什麼是響應者鏈
響應者鏈就是多個響應者對象組成的鏈
事件的基本概念
UIEvent:事件,是由硬件捕捉的一個表示用戶操作設備的對象。
分三類:觸摸事件、晃動事件、遠程控制事件
觸摸事件:用戶通過觸摸設備屏幕操作對象、輸入數據。支持多點觸摸,包含1個到多個觸摸點
UIView支持觸摸事件(因為繼承於UIResponder),而且支持多點觸摸。
需要定義UIView子類,實現觸摸相關的方法。
touches..began、
touches..moved、
touches...ended、
touches..canceled
手勢:有規律的觸摸。
UITouch代表觸摸在屏幕上的一根手指。可以獲取觸摸時間和觸摸位置。
如何獲取touch對象。touches集合中包含了視圖上的所有?勢
[3]什麼是響應者鏈
響應者鏈就是多個響應者對象組成的鏈
UIResponder。響應者類。
iOS中所有能響應事件(觸摸、晃動、遠程事件)的對象都是響應者。
系統定義了一個抽象的父類UIResponder來表示響應者。其子類都是響應者
硬件檢測到觸摸操作,會將信息交給UIApplication,開始檢測。
UIApplication -> window -> viewController -> view -> 檢測所有?子視圖
最終確認觸摸位置,完成響應者鏈的查詢過程
檢測到響應者後,實現touchesBegan:withEvent:等方法,即處理事件。
如果響應者沒有處理事件,事件會向下傳遞。如果沒有響應者處理, 則丟棄觸摸事件。
事件處理的順序與觸摸檢測查詢相反。
觸摸的?視圖 -> view -> viewController -> window -> UIApplication
響應者鏈可以被打斷。?法完成檢測查詢過程。
視圖類的屬性 : userInteractionEnabled。關閉後能阻斷查詢過程。
代碼:#import "TestView.h" #import "RootView.h" #define KRandomColor arc4random()%256/255.0 @interface TestView() { //開始觸摸的點 CGPoint _start; } @end @implementation TestView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor redColor]; } return self; } //開始觸摸事件的時候,執行touch 裡面的預定的執行事件代碼(開始觸摸的時候,到這看看) //一次觸摸事件發生時,該方法只執行一次 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //觸摸的時候隨機顏色(KRandomColor是在延展裡定義的隨機數) self.backgroundColor = [UIColor colorWithRed:KRandomColor green:KRandomColor blue:KRandomColor alpha:1]; //第一次觸摸時候的坐標 _start = [[touches anyObject] locationInView:self]; NSLog(@"點我改變顏色"); } //一次觸摸事件尚未結束,會一直調用該方法 //沒摸完,就一直摸 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //移動的點 CGPoint nowPoint = [[touches anyObject] locationInView:self]; //移動的點減去開始觸摸的點 CGFloat x = nowPoint.x - _start.x; CGFloat y = nowPoint.y - _start.y; CGPoint centerPoint = CGPointMake(self.center.x + x, self.center.y + y); self.center = centerPoint; //打印移動時候的坐標 NSLog(@"%@",NSStringFromCGPoint(nowPoint)); } //一次觸摸時間結束,執行該方法 //觸摸完成 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"結束了"); } //觸摸時間被別的打斷, //有人打擾 -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { } @end