1.touch events(觸控事件)
2.motion events(運動事件)
3.remote events (遠端事件)
4.press events(按壓事件)
1.事件產生和傳遞
2.找到合適的view處理
3.處理事件或者捨棄
這裡主要是說觸控事件。
響應者物件:可以處理事件的物件,即uiresponder的子類物件。
- (void)touchesbegan:(nsset *)touches withevent:(nullable uievent *)event; //手指觸控到螢幕
- (void)touchesmoved:(nsset *)touches withevent:(nullable uievent *)event; //手指在螢幕上移動或按壓
- (void)touchesended:(nsset *)touches withevent:(nullable uievent *)event; //手指離開螢幕
- (void)touchescancelled:(nsset *)touches withevent:(nullable uievent *)event; //觸控被中斷,例如觸控時**呼入
如果ios要對事件進行響應,則這個物件必須繼承了uiresponder的物件。就算是繼承了uiresponder也有情況不能進行事件響應。
1.不是uiresponder的子類。
2.控制項的userinteractionenabled屬性為no。
3.控制項被隱藏了(父控制項被隱藏,所有的子控制項也被隱藏)。
4.透明對低於0.01。
- (uiview *)hittest:(cgpoint)point withevent:(uievent *)event;//方法作用是返回最合適處理事件的物件
pointinside:withevent:方法作用是判斷點是否在檢視內,是則返回yes,否則返回no
2 根據響應者的判斷,如果當前視窗不是合適的響應者,則會把訊息傳遞給響應鏈中的下乙個響應者。
下乙個響應者的判斷原則
uiview
如果當前的view為控制器的根view,那麼控制器就是下乙個響應者。如果當前view不是控制器的view,則這個view的父控制項就是下乙個響應者。
uiviewcontroller
如果viewcontroller的view是window的根view,那麼下乙個響應者就是window,如果viewcontroller是模態出來的,下乙個響應者就是模態出這個viewcontroller的viewcontroller,如果viewcontroller的view是被add到另外乙個controller的根view上,那麼下乙個響應者就是viewcontroller的根view。
uiwindow
3.如果再檢視層次結構的最頂層還是不能處理事件或者訊息就把事件傳遞給window物件進行處理。
uiresponder * next = [self nextresponder];
nsmutablestring * prefix = @"".mutablecopy;
while (next != nil)
原始碼
mytouchview.h
//
// mytouchview.h
// shijiandemo
//// created by liuyinghui on 2018/3/5.
//#import @inte***ce mytouchview : uiview
@end
mytouchview.m
//
// mytouchview.m
// shijiandemo
//// created by liuyinghui on 2018/3/5.
//#import "mytouchview.h"
@implementation mytouchview
- (nullable uiview *)hittest:(cgpoint)point withevent:(nullable uievent *)event // recursively calls -pointinside:withevent:. point is in the receiver's coordinate system
@end
iOS事件傳遞機制
我的理解 第一步 hit testing找到 hit test view window,儲存在 呢?找到響應者鏈 響應者鏈中的view鏈,儲存在 呢?第二步 第乙個touch 1 touch 初始化,沿著鏈條找哪些要響應 event?不知道儲存在 2 沿著鏈條找哪些要響應 touch,儲存在 tou...
IOS和OSX事件傳遞機制
文章開頭說到有ios三種event型別,事件傳遞中uiwindow會根據不同的event,用不同的方式尋找initial object,initial object決定於當前的事件型別。比如touch event,uiwindow會首先試著把事件傳遞給事件發生的那個view,就是下文要說的hit t...
iOS事件傳遞和事件響應者鏈 20170810
區別 事件的傳遞和響應的區別 事件的傳遞是從上到下 父控制項到子控制項 事件的響應是從下到上 順著響應者鏈條向上傳遞 子控制項到父控制項。引出 當我們手指觸控螢幕的時候,ios系統是怎麼找到對應的圖層,並響應手勢的呢?事件的產生 主視窗會在檢視層次結構中找到乙個最合適的檢視來處理觸控事件,這也是整個...