天天看點

iOS中事件響應的學習記錄

touch事件分為3類

  • 觸控事件(單點、多點觸控以及各種手勢操作)
  • 傳感器事件(重力、加速度傳感器等)
  • 遠端控制事件(遠端遙控iOS裝置多媒體播放等)

觸控事件分為加入了手勢 也沒有加入的情況,如果加入了手勢,手勢會截取點選事件.手勢分為好幾種,例如單擊,長按,拖拽等.如果是單擊事件的話狀态就會是從可識别到成功或失敗,如果是多點觸摸就會由可識别,到失敗或者開始,改變,已識别或取消.

UITouch

  • touchesBegan:withEvent:
  • touchesMoved:withEvent:
  • touchesEnded:withEvent:
  • touchesCancelled:withEvent:

響應者鍊

hit-test view

hitTest:withEvent:方法的處理流程如下:

首先調用目前視圖的pointInside:withEvent:方法判斷觸摸點是否在目前視圖内;

若傳回NO,則hitTest:withEvent:傳回nil;

若傳回YES,則向目前視圖的所有子視圖(subviews)發送hitTest:withEvent:消息,所有子視圖的周遊順序是從最頂層視圖一直到到最底層視圖,即從subviews數組的末尾向前周遊,直到有子視圖傳回非空對象或者全部子視圖周遊完畢;

若第一次有子視圖傳回非空對象,則hitTest:withEvent:方法傳回此對象,處理結束;

如所有子視圖都傳回非,則hitTest:withEvent:方法傳回自身(self)。

事件傳遞機制

view 向上一層傳遞,如果上一層不能響應還會向上一層繼續傳遞,一直傳遞到rootVC,如果rootvc還不能相應的話則會傳遞給windows,如果windows還不能相應的話,會傳遞給application,如果繼續不能相應則廢棄這次觸摸事件.

參考文章:iOS事件機制 Cocoa Touch事件處理流程--響應者鍊