事件的分發(fā)和傳遞随夸。
1.當(dāng)iOS程序中發(fā)生觸摸事件后尺上,系統(tǒng)會(huì)將事件加入到UIApplication管理的一個(gè)任務(wù)隊(duì)列中
2.UIApplication將處于任務(wù)隊(duì)列最前端的事件向下分發(fā)屠升。即UIWindow蔬充。
3.UIWindow將事件向下分發(fā),即UIView。
4.UIView首先看自己是否能處理事件,觸摸點(diǎn)是否在自己身上靖诗。如果能,那么繼續(xù)尋找子視圖沪斟。
5.遍歷子控件广辰,重復(fù)以上兩步。
6.如果沒有找到主之,那么自己就是事件處理者择吊。如果
7.如果自己不能處理,那么不做任何處理槽奕。
其中 UIView不接受事件處理的情況主要有以下三種:
- alpha <0.01
- userInteractionEnabled = NO
- hidden = YES.
用一張圖來(lái)表示:
日常開發(fā)中我們會(huì)遇到一些情況几睛,如:
子視圖超出父視圖的情況下依舊可以觸發(fā)事件
EG
如圖:
超出的部分無(wú)法觸發(fā)事件。
解決方案
這種情況下粤攒,我們可以重寫父視圖的hitTest:withEvent:
方法所森,獲得焦點(diǎn)囱持,然后判斷焦點(diǎn)位置,最后交給誰(shuí)來(lái)處理這個(gè)時(shí)間
解決方案如下:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
//判斷點(diǎn)在不在后面的按鈕身上
//首先要想判斷在不在后面按鈕范圍內(nèi)必須先把兩個(gè)坐標(biāo)放在同一坐標(biāo)系下
//把當(dāng)前的點(diǎn)轉(zhuǎn)換到按鈕身上的坐標(biāo)系的點(diǎn)
CGPoint btnP = [self convertPoint:point toView:self.btn];
if ([self.btn pointInside:btnP withEvent:event]) {
//如果在后面按鈕上焕济,可以返回按鈕纷妆,讓按鈕響應(yīng)事件
return self.btn;
}else{
//如果不在就按照系統(tǒng)默認(rèn)做法
return [super hitTest:point withEvent:event];
}
}
最終效果:
是不是挺方便的,如果文章對(duì)你有用的話就給個(gè)支持小愛心謝謝:)