小夥伴們在開發中是否遇到過這樣的需求呢,乙個控制項的某個部分被另外乙個控制項遮擋住,當點選這個重疊部分時,需要響應被遮蓋控制項的點選事件,就如下圖所示當我們點選區域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方法,**如下
來看執行結果,點選區域2時,紅色按鈕高亮並響應事件- (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];
}
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,則向當前...