iOS學習筆記1 -- 觸控與手勢
iOS學習筆記1 – 觸控與手勢
- 觸控
- 手勢
觸控
- 觸控響應方法
- 響應者鏈
- 響應者鏈的時間傳遞過程
- UIview不接受觸控事件的3中情況
- 事件
- 補充
觸控響應方法
如果想通過自定義事件響應使用者觸控事件,則通過UIResponder的4個方法實現:
1:• -(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event;
當用戶手指開始觸控控制元件時觸發
2:• -(void)touchesMoved:(NSSet )touches withEvent:(UIEvent
當用戶手指在空間上移動時觸發
3:• -(void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event;
當用戶手指結束觸控控制元件(手指擡起)時觸發
4:• -(void)touchesCancelled:(NSSet )touches withEvent:(UIEvent )event;
當系統事件(電話呼入,記憶體不足)終止觸控事件時觸發該方法
響應者鏈
在iOS中不是所有物件都能響應時間,只有繼承UIResponder的物件就可以作為事件的響應者.在iOS的UI控制元件中不是繼承UIview就是繼承UIControl,而UIControl繼承UIview,,UIview繼承了UIResponder,故所有的UI控制元件都能響應事件.
響應者鏈:每一個時間都有一個響應鏈,包含眾多時間響應者.使用者和一個控制元件開始互動(點選,滑動等等)時第一響應者是該控制元件,作為響應者鏈的開始,然後事件由響應者鏈開始傳遞直到被某個響應者處理(沒有處理這丟棄不管).
響應者鏈的時間傳遞過程
•通常來說第一響應者(響應者鏈的開始)是某個UIview或者UIview子類控制元件,使用者開始互動是時間由該控制元件自己處理
•如果控制元件不能處理則傳到該空間對應的檢視控制器
•如果檢視控制器不能處理則傳到該控制元件的父view
•重複第二第三步,當最底層view還不能處理是則傳到UIwindow
•如果UIwindow還不能處理則傳遞到UIApplication的委託物件即AppDelegate
•如果還不能處理則丟棄
UIview不接受觸控事件的3中情況
•不接受使用者互動userInteractionEnable = NO;比如UILabel,UIImageView等控制元件userInteractionEnable預設值為no,要互動則需要手動改為YES
•隱藏:hidden=YES;
•����透明:alpha=0.0~0.01;
事件(UIEvent)
•����一個UITouch表示一個觸控
•����一個UIEvent表示一個時間
•����事件物件包含當前多點觸控相對應的所有物件
•獲取觸控事件的座標
補充
當觸控一次和兩次響應不同方法是,我們會發現點選兩次會同時觸發點選一次和點選兩次的方法,我們可以改寫一下就可以只響應點選兩次
•����1)第一種方法在方法中判斷tapCount
•����2)第二種先延遲執行點選一次的方法,如果在規定事件內有第二次點選這取消執行方法,否則執行點選一次的方法
[self performSelector:@selector(tap) withObject:nil afterDelay:0.4];方法中的afterDelay是延遲時間
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tap) object:nil];取消執行方法
手勢
������������通過touches��������方法監聽事件,不容易區分使用者的具體手勢行為.故蘋果推出了手勢處理器��(UIGestureRecognizer)
- 使用手勢處理器處理使用者手勢的步奏
- UIGestureRecognizer常用方法和屬性
- 手勢–點選
- 手勢–捏合
- 手勢–旋轉
- 手勢–輕掃
- 手勢–拖動
手勢–長按
使用手勢處理器處理使用者手勢的步奏
1:根據程式要處理的手勢建立對應的手勢處理器物件.並指定對應的target和action引數(該控制元件發生建立的手勢後,改target和action方法會響應).
2:如果該UI控制元件不允許互動則userInteractionEnable要手動設為YES,如果希望多點互動mutipleTouchEnabled屬性要設為YES.
3:呼叫該UI控制元件的addGestureRecognizer:方法新增手勢處理器UIGestureRecognizer常用方法和屬性
• - (CGPoint)locationInView:(UIView*)view;返回手勢在的view控制元件中的觸控位置(相對控制元件左上方的座標)
• - (NSUInteger)numberOfTouches;返回手勢觸點數量
• view��:返回激發手勢的UI控制元件
• enabled��:設定和返回手勢控制器是否可用
• state��:獲取該手勢的狀態
UIGestureRecognizerStateBegan:手勢剛開始
UIGestureRecognizerStateChanged:手勢改變時
UIGestureRecognizerStateEnded:手勢結束時狀態手勢–點選
• UITapGestureRecognizer(點選手勢) 除了擁有其父類(UIGestureRecognizer)的方法,還有提供了兩個屬性
• numberOfTapsRequired:指定手勢只處理觸控(點選)幾次的事件
• numberOfTouchesRequired��: 指定只處理幾個手指(觸控點)的觸控事件
手勢–捏合
• UIPinchGestureRecognize(捏合手勢) 和UITapGestureRecognizer(點選手勢) 使用步奏相同,同樣除了擁有其父類(UIGestureRecognizer)的方法,還有提供了兩個屬性
• scale:獲取捏合比例
• velocity:獲取捏合速度
手勢–旋轉
• UIRotationGestureRecognizer(旋轉手勢),使用步奏和上面兩個一樣,除了父類方法屬性有兩個獲取旋轉相關的資訊
• rotation:獲取旋轉角度
• velocity:獲取旋轉速度
手勢–輕掃
• UISwipeGestureRecognizer(輕掃手勢),步奏父類同,兩個輕掃的屬性
• numberOfTouchesRequired:設定值處理幾個手指的觸控事件
• direction:列舉值,設定該處理器只處理某個方向(up,down,right,left)的輕掃事件
手勢–拖動
• UIPanGestureRecognizer(拖動),步奏父類同,兩個拖動的屬性
• maximumNumberOfTouches:設定最多支援幾個手指拖動
• minimumNumberOfTouches:設定最少需要幾個手指拖動
此外還有兩個方法獲取有關拖動的資訊:
• translationInView:獲取手指在控制元件上的位移.返回一個CGPoint型別,x代表水平位移值,y值代表垂直方向位移值
• -velocityInView:獲取手勢在控制元件上的速度.同樣返回一個CGPoint型別值,x代表水平速度,y值代表垂直速度(想到了高中物理速度分解).
手勢–長按
��������������������������在使用者用一個或多個手指在螢幕上長按,不鬆開的過程中,可以用UILongPressGestureRecognizer來檢測到使用者的這種手勢
• UILongPressGestureRecognizer 步奏父類同,有一下屬性設定手勢處理器相關資訊
• minimumPressDuration: 指定使用者至少按多長時間觸發長按手勢.預設0.5s
• allowableMovement: 指定手勢允許用使用者手指移動的最大距離,超過這個距離這手勢失敗.
• numberOfTouchesRequired:指定使用者必須幾個手指按在螢幕上長按多久才能觸發長按手勢
上面程式碼長按一次會列印兩次”觸發長按手勢”,因為在長按手勢開始和結束都會觸發一次handleLongPress:方法.其實是響應了不同狀態的才會多次觸發該方法.故我們需要在handleLongPress:裡面加上判斷