事件分發(fā)
事件分發(fā)過程包含兩方面:
- 點擊事件的傳遞過程,主要是通過Hit-TestView查找當(dāng)前被點擊的點屬于哪一個View晾浴。
- 響應(yīng)鏈,事件的響應(yīng)過程,主要是某個View如何響應(yīng)點擊事件溶握。
點擊事件傳遞
當(dāng)點擊屏幕時,通過hit-testing找到觸摸點所在的view蒸播,查找過程如下:
- 從window開始一層一層往下遍歷所有的子View;
- 如果某個View的userInteractionEnabled = NO, enabled = NO, 或alpha <= 0.01, hidden = YES 等情況睡榆,則說明該View不是響應(yīng)View, 直接返回nil, 不再在此View及其subView中查找。
- 如果觸摸點不再View中袍榆,直接返回nil, 不再在此View及其subView中查找胀屿。
- 如果觸摸點在View中,則繼續(xù)遍歷它的子View, 直到找到被點擊的View包雀。
總結(jié)下點擊事件的傳遞宿崭,從window開始查找,一層一層的遍歷其subview才写,找到被點擊的點在哪個View葡兑。 從大View到小View查找。
事件響應(yīng)鏈
通過hit-testing找到響應(yīng)的view之后赞草,點擊事件就交給它來處理讹堤,此時hit-testView就是firstResponder,如果它無法響應(yīng)事件房资,則把事件交給它的父View蜕劝,直到有事件的響應(yīng)者或傳遞到appDelegate結(jié)束為止。
這一系列的響應(yīng)者和事件的傳遞方向就是響應(yīng)鏈轰异,在響應(yīng)鏈中岖沛,所有響應(yīng)者的基類都是UIResponder, 也就是說所有可以響應(yīng)事件的類都是UIResponder的子類。
總結(jié)下事件響應(yīng):從子View開始響應(yīng)事件搭独,如果不能響應(yīng)婴削,則往上看父View是否能響應(yīng),如果能響應(yīng)則響應(yīng)牙肝,如果不能則繼續(xù)往上查找直到appDelegate結(jié)束唉俗。從小View到大View查找嗤朴。