iOS-事件傳遞鏈hitTest

事件的分發和傳遞。

  1. 當iOS程序中發生觸摸事件後,系統會將事件加入到UIApplication管理的一個任務隊列中
  2. UIApplication將處於任務隊列最前端的事件向下分發。即UIWindow。
  3. UIWindow將事件向下分發,即UIView。
  4. UIView首先看本身是否能處理事件,觸摸點是否在本身身上。若是能,那麼繼續尋找子視圖。
  5. 遍歷子控件,重複以上兩步。
  6. 若是沒有找到,那麼本身就是事件處理者。若是
  7. 若是本身不能處理,那麼不作任何處理。
其中 UIView不接受事件處理的狀況主要有如下三種:
  1. alpha <0.01
  2. userInteractionEnabled = NO
  3. hidden = YES.

用一張圖來表示:

時間傳遞鏈過程
平常開發中咱們會遇到一些狀況,如: 子視圖超出父視圖的狀況下依舊能夠觸發事件

EG:

如圖: 前端

test1
超出的部分沒法觸發事件。

解決方案

這種狀況下,咱們能夠重寫父視圖的hitTest:withEvent:方法,得到焦點,而後判斷焦點位置,最後交給誰來處理這個時間 解決方案以下:bash

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    //判斷點在不在後面的按鈕身上
    //首先要想判斷在不在後面按鈕範圍內必須先把兩個座標放在同一座標系下
    //把當前的點轉換到按鈕身上的座標系的點
    CGPoint btnP = [self convertPoint:point toView:self.btn];
    if ([self.btn pointInside:btnP withEvent:event]) {
        //若是在後面按鈕上,能夠返回按鈕,讓按鈕響應事件
        return self.btn;
    }else{
        //若是不在就按照系統默認作法
        return [super hitTest:point withEvent:event];
    }
}

複製代碼

最終效果:

test3.gif
相關文章
相關標籤/搜索