iOS之事件穿透

2022-05-30 22:00:17 字數 1567 閱讀 6722

小夥伴們在開發中是否遇到過這樣的需求呢,乙個控制項的某個部分被另外乙個控制項遮擋住,當點選這個重疊部分時,需要響應被遮蓋控制項的點選事件,就如下圖所示

當我們點選區域3時,響應藍色按鈕的點選事件,點選區域1和2時,響應紅色按鈕的點選事件,對於區域1和3沒什麼好說的,那如何讓紅色按鈕響應區域2的點選呢?這就是筆者今天要講的內容。

事件傳遞

上圖中藍色按鈕在紅色按鈕之後新增,當系統尋找最適合的控制項時,藍色按鈕在紅色按鈕之前被找到,系統發現藍色按鈕很適合處理事件,所以方法便返回了,紅色按鈕就沒有了處理事件的機會。

系統如何尋找最適合控制項

我們來看看系統內部是如何實現的,筆者這裡自定義了乙個uiwindow,讓它成為主視窗,並重寫它的hittest方法,執行之後,其事件處理功能,與系統的類似,所以系統內部大概就是這樣實現的

當乙個控制項的透明度小於某個值時,就不再響應事件,上圖中0.01僅僅是為了測試,並非準確的值,要注意的就是,對於繼承自uicontrol的控制項,還需要判斷enable的值

事件穿透

既然系統尋找最合適控制項的方法滿足不了我們,那我們就重寫系統的方法

思路
有了思路,那萬事具備只欠東風了,接下來上東風

新建乙個類,繼承自uibutton,筆者這裡直接命名為bluebutton,修改sb\xib中藍色按鈕的型別為bluebutton

將紅色按鈕連線到bluebutton.m檔案中,不用試了,直接連是連不了的,我們可以先在bluebutton.m中定義乙個屬性,前面加上iboutlet,然後單擊圖中的空心圓,拖到紅色按鈕上就ok了

最後,在bluebutton.m中重寫藍色按鈕的hittest方法,**如下

- (uiview *)hittest:(cgpoint)point withevent:(uievent *)event 

//如果希望嚴謹一點,可以將上面if語句及裡面**替換成如下**

//uiview *view = [_redbutton hittest: redbtnpoint withevent: event];

//if (view) return view;

return [super hittest:point withevent:event];

}

來看執行結果,點選區域2時,紅色按鈕高亮並響應事件

iOS 控制項響應使用者控制事件之事件處理

原文 加速計事件 遠端控制事件 uitouch的作用 uitouch的方法 cgpoint locationinview uiview view cgpoint previouslocationinview uiview view 常見屬性 事件型別 property nonatomic,reado...

IOS開發之 事件處理 手勢識別 71

ios3.2之後,蘋果推出了手勢識別功能 guesture recognizer 在觸控事件處理方面,大大簡化了開發者的開發難度 uigesturerecognizer是乙個抽象類,定義了所有手勢的基本行為,使用它的子類才能處理具體的手勢 手勢uitapgesturerecognizer tap u...

觸控事件之事件傳遞

uiview是如何判定這個事件是否是自己應該處理的呢?hittest withevent 方法的處理流程如下 呼叫當前view的pointinside withevent 方法來判定觸控點是否在當前view內部,如果返回no,則hittest withevent 返回nil 如果返回yes,則向當前...