在用戶使用app的過程中 會產(chǎn)生各種各樣的事件 大致可以分為3個類型
1,觸摸事件//如 點(diǎn)擊屏幕 拖拽....
2,加速計事件//如 搖一搖
3,遠(yuǎn)程控制事件//如 遙控器遠(yuǎn)程操作
在IOS中 不是任何對象都能處理事件的 ?只有繼承了 UIResponder的對象 才能接受并處理事件
UIApplication,UIViewController,UIView 都是繼承自 UIResponder 因此它們都是響應(yīng)者對象 ?都能夠接受并處理事件
無法進(jìn)行交互的情況
控件的透明度 在 0~0.01之間是無法接受交互的
控件的userInteractionEnable = NO 是無法進(jìn)行交互的
控件超出父控件的部分是無法接收交互的 ?即使設(shè)置clipToBounds=YES 能看見 也無法進(jìn)行交互
控件的hidden = YES 是無法進(jìn)行交互的
事件傳遞: ?就是當(dāng)產(chǎn)生交互事件時 ?查到到最適合處理事件的對象
1, ?當(dāng)事件產(chǎn)生時 ?主循環(huán)捕獲事件 ? 接下來進(jìn)行查找 尋找最適合處理事件的對象(即第一響應(yīng)者)
2,查找順序: ?UIApplication?—> UIWindow?—> rootViewController?—> UIView
在UIView中 會遍歷 它的子View 查看其是否適合 處理事件
在遍歷的時候 是按照該其 子View數(shù)組的 倒序來進(jìn)行遍歷//也就是從 顯示在最上面的開始遍歷
在觸摸事件實(shí)際查找時會調(diào)用下面的方法
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event;
//判斷該觸摸事件的 觸摸坐標(biāo) 是否在當(dāng)前的View上 ? 若在 則返回YES
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event;
// 當(dāng)事件產(chǎn)生 時 會調(diào)用該方法
hitTest: withEvent: 方法內(nèi)部邏輯參考
hitTest: withEvent: 方法的活用
當(dāng) 我們不希望 第一響應(yīng)者 和 觸摸對象 一一對應(yīng)時//如 希望一個view的超出 父view的部分 可以響應(yīng)觸摸
則可以在 其父view的父view中 重寫hitTest方法 當(dāng)觸摸點(diǎn)在某個范圍時 則返回該view作為第一響應(yīng)者
//注意 在實(shí)現(xiàn)時 注意要選用統(tǒng)一的坐標(biāo)系
響應(yīng)者鏈條
若 事件傳遞完成 ?則找到了最佳的事件處理對象 ——> 成為 第一響應(yīng)者
當(dāng)?shù)谝豁憫?yīng)者 無法響應(yīng)事件 ?則會交給下一響應(yīng)者(nextResponder)來處理 若其無法處理 會在下一個NextResponder中尋找
若知道UIApplication時 都無法響應(yīng) 則丟棄該事件
view 的nextResponder的選擇: ?若有控制器 管理該控件 則nextResponder為其控制器 ——>父View
若無控制器 管理該對象 則nextResponder 為其父View
其他的nextResponder選擇
RootViewController?—> UIWindow?—> UIApplication?—> nil
在響應(yīng)鏈 中 無論這個第一響應(yīng)者 是否對這個事件 進(jìn)行了處理 都會響應(yīng)到 UIApplication ?如果想要中斷響應(yīng)鏈 ?則在 重寫的Touch方法中 不調(diào)用其父類方法
簡書用的不熟練 排版有些難看 歡迎大家多多指正 共同學(xué)習(xí)