文章搬運來源:blog.csdn.net/Calvin_zhou…面試
做者:PGzxc(若有侵權,聯繫做者,當即刪除)markdown
對iOS開發感興趣,能夠看一下做者的iOS交流羣:812157648,你們能夠在裏面吹水、交流相關方面的知識,羣裏還有我整理的有關於面試的一些資料,歡迎你們加羣,你們一塊兒開車oop
一 事件的產生和處理
- 發生觸摸事件後,系統會將該事件加入到一個由UIApplication管理的事件隊列中
- UIApplication會從事件隊列中取出最前面的事件,並將事件分發下去以便處理,一般,先發送事件給應用程序的主窗口(keyWindow)
- 主窗口會在視圖層次結構中找到一個最合適的視圖來處理觸摸事件,可是這僅僅是整個事件處理過程當中的第一步
- 找到合適的視圖控件後,就會調用視圖控件的touches方法來做具體的事件處理
- touchesBegan..
- touchesMoved..
- touchesEnded..
複製代碼
二 事件傳遞示例
2.1 界面佈局
2.2 界面關係說明
- BaseView:繼承自UIView,複寫touchesBegan方法
- WhiteView:繼承自BaseView,是窗體的View
- GreenView:繼承自BaseView,是2號綠色窗體的View
- OrangeView:繼承自BaseView,是2號橙色窗體的View
- BlueView:繼承自BaseView,是3號藍色窗體的View
- RedView:繼承自BaseView,是3號紅色窗體的View
- YellowView:繼承自BaseView,是4號黃色窗體的View
2.3 代碼(BaseView -touchesBegan)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"%@",[self class]);
}
複製代碼
2.4 觸摸事件的傳遞是從父控件傳遞到子控件
- 點擊了綠色的view:UIApplication—>UIWindow—>白色—>綠色
- 點擊了藍色的view:UIApplication—>UIWindow—>白色—>橙色—>藍色
- 點擊了黃色的view:UIApplication—>UIWindow—>白色—>橙色—>藍色—>黃色
2.5 說明
- 若是父空間不能接收觸摸事件,那麼子控件就不可能接收到觸摸事件
三 UIVIew不接收觸摸事件的三種狀況
3.1 不接收用戶交互
userInteractionEnabled=NO
複製代碼
3.2 隱藏
hidden=YES
複製代碼
3.3 透明
aplpa=0.0~0.01
複製代碼
提示:UIImageView的userInteractionEnabled默認就是NO,所以UIImageView以及它的子控件默認是不能接收觸摸事件的佈局
四 如何找到最合適的控件來處理事件
- 本身是否能接收觸控事件?否,事件傳遞到此結束
- 觸摸點是否在本身身上?否,事件傳遞到此結束
- 從後往前遍歷子控件,重複前面的兩個步驟
- 若是沒有符合條件的子控件,那麼就本身最合適處理