iOS 點(diǎn)擊穿透上層視圖響應(yīng)事件

昨天被問(wèn)到了一個(gè)問(wèn)題,如下

一個(gè)子視圖能不能透過(guò)上層視圖來(lái)響應(yīng)自己的點(diǎn)擊事件餐抢?如果能现使,怎么實(shí)現(xiàn)?

這種題用腳想都是能啊旷痕,可怎么做碳锈??欺抗?
經(jīng)過(guò)簡(jiǎn)單研究售碳,發(fā)現(xiàn)了解決辦法。如下:

這里涉及到一個(gè)視圖的方法
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;
這是在UIView(UIViewGeometry)視圖結(jié)構(gòu)分類里面的方法绞呈,使用方法如下:

1. 背景知識(shí)

iOS系統(tǒng)檢測(cè)到手指觸摸(Touch)操作時(shí)會(huì)將其放入當(dāng)前活動(dòng)Application的事件隊(duì)列贸人,Application會(huì)從事件隊(duì)列中取出觸摸事件并傳遞給key window(當(dāng)前接收用戶事件的窗口)處理,window對(duì)象首先會(huì)使用hitTest:withEvent:方法尋找此次Touch操作初始點(diǎn)所在的視圖(View)佃声,即需要將觸摸事件傳遞給其處理的視圖,稱之為hit-test view艺智。

window對(duì)象會(huì)在首先在view hierarchy的頂級(jí)view上調(diào)用hitTest:withEvent:,此方法會(huì)在視圖層級(jí)結(jié)構(gòu)中的每個(gè)視圖上調(diào)用pointInside:withEvent:圾亏,如果pointInside:withEvent:返回YES十拣,則繼續(xù)逐級(jí)調(diào)用,直到找到touch操作發(fā)生的位置志鹃,這個(gè)視圖也就是hit-test view父晶。

2. 處理流程

  1. 首先調(diào)用當(dāng)前視圖的pointInside:withEvent:方法判斷觸摸點(diǎn)是否在當(dāng)前視圖內(nèi);
  2. 若返回NO弄跌,則hitTest:withEvent:返回nil甲喝;
  3. 若返回YES,則向當(dāng)前視圖的所有子視圖(subviews)發(fā)送hitTest:withEvent:消息铛只,所有子視圖的遍歷順序是從top到bottom埠胖,即從subviews數(shù)組的末尾向前遍歷,直到有子視圖返回非空對(duì)象或者全部子視圖遍歷完畢糠溜;
  4. 若第一次有子視圖返回非空對(duì)象,則hitTest:withEvent:方法返回此對(duì)象直撤,處理結(jié)束非竿;
  5. 如所有子視圖都返回非,則hitTest:withEvent:方法返回自身(self)谋竖。

3. 使用

直接參考代碼

// 在父視圖中實(shí)現(xiàn)方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // 1.這是當(dāng)前點(diǎn)擊的視圖红柱,如果沒(méi)有找到合適的響應(yīng)操作的視圖,則直接返回這個(gè)
    UIView *view = [super hitTest:point withEvent:event];

    // 2.將父視圖坐標(biāo)轉(zhuǎn)成我想要響應(yīng)事件的視圖的坐標(biāo)
    CGPoint buttonPoint = [self convertPoint:point toView:self.button];

    // 3.判斷該坐標(biāo)是否在視圖內(nèi)部蓖乘,如果是锤悄,則返回該視圖
    if ([self.button pointInside:buttonPoint withEvent:event]) {
        return self.button;
    }
    return view;
}

代碼寫(xiě)起來(lái)也是簡(jiǎn)單明了,但有幾個(gè)注意事項(xiàng)嘉抒,如下:

  1. 設(shè)置hidden = YES;仍然是可以通過(guò)該方法響應(yīng)事件零聚。
  2. 設(shè)置alpha = 0.001;也是可以通過(guò)該方法響應(yīng)事件。
  3. 子視圖的 origin 即使超出父視圖的范圍也是可以響應(yīng)事件些侍。
  4. 設(shè)置userInteractionEnabled = NO;則不可以響應(yīng)事件了隶症。

這種方式可以做出很多風(fēng)騷的操作,就看各位的想象力了~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岗宣,一起剝皮案震驚了整個(gè)濱河市蚂会,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耗式,老刑警劉巖胁住,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纽什,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)躲叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)芦缰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枫慷,你說(shuō)我怎么就攤上這事让蕾。” “怎么了或听?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵探孝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我誉裆,道長(zhǎng)顿颅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任足丢,我火速辦了婚禮粱腻,結(jié)果婚禮上庇配,老公的妹妹穿的比我還像新娘。我一直安慰自己绍些,他們只是感情好捞慌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著柬批,像睡著了一般啸澡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮帐,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天嗅虏,我揣著相機(jī)與錄音,去河邊找鬼揪漩。 笑死旋恼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奄容。 我是一名探鬼主播冰更,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昂勒!你這毒婦竟也來(lái)了蜀细?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤戈盈,失蹤者是張志新(化名)和其女友劉穎奠衔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體塘娶,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡归斤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刁岸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脏里。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虹曙,靈堂內(nèi)的尸體忽然破棺而出迫横,到底是詐尸還是另有隱情,我是刑警寧澤酝碳,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布矾踱,位于F島的核電站,受9級(jí)特大地震影響疏哗,放射性物質(zhì)發(fā)生泄漏呛讲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圣蝎。 院中可真熱鬧刃宵,春花似錦、人聲如沸徘公。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)关面。三九已至坦袍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間等太,已是汗流浹背捂齐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缩抡,地道東北人奠宜。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瞻想,于是被迫代替她去往敵國(guó)和親压真。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容