1. 程式人生 > >iOS學習筆記1 -- 觸控與手勢

iOS學習筆記1 -- 觸控與手勢

iOS學習筆記1 – 觸控與手勢

  • 觸控
  • 手勢

觸控

  • 觸控響應方法
  • 響應者鏈
  • 響應者鏈的時間傳遞過程
  • UIview不接受觸控事件的3中情況
  • 事件
  • 補充

觸控響應方法
如果想通過自定義事件響應使用者觸控事件,則通過UIResponder的4個方法實現:
1:• -(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event;
當用戶手指開始觸控控制元件時觸發
2:• -(void)touchesMoved:(NSSet )touches withEvent:(UIEvent

)event;
當用戶手指在空間上移動時觸發
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:裡面加上判斷
    手勢長按2