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