iOS - 事件的產(chǎn)生和傳遞

作者:Mitchell 

一、響應者對象

  • 在iOS中并不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接受并處理時間,稱為“響應者”。
  • UIApplication、UIViewController、UIView都繼承自UIResponder,它們都能是響應者對象,處理事件。

二、 事件傳遞的順序

  • 1、先將事件對象由下往上傳遞(由父控件傳遞給子控件),找到最合適的控件來處理這個事件,如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖。
  • 2、調(diào)用最合適的控件的 touches 方法,在視圖層次結構的最頂級視圖,如果也不能處理收到的事件或者消息,則將時間或消息傳遞給window對象進行處理。
  • 3、如果調(diào)用了 [super touches] 就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者,如果window對象也不處理,則其將時間活消息傳遞給UIApplication對象。
  • 4、接著會調(diào)用上一個響應者的 touches 方法。如果UIApplication也不能處理該事件或消息,則將其丟棄。
  • 事件傳遞順序:事件->UIApplication ->UIWindow (之后會尋找最合適的view)->rootView-> rootView子控件... (直到尋找到最合適的view來觸發(fā)事件)

三、如何判斷上一個響應者

  • 如果當前這個view是控制器的view,那么控制器就是上一個響應者
  • 如果當前這個view不是控制器的view,那么父控件就是上一個響應者

四、尋找最合適的view

  • 讓一個view不接受觸摸事件:
    • userInteractionEnabled = NO
    • hidden = YES
    • alpha = 0.0~0.01
  • 尋找最合適的view:
    • 首先查找當前控件的子控件,從后遍歷,看是否是合適的響應者。
      • 通過此方法來判斷我們所點擊的點是否在當前view上
 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return NO;
}
    *  之后通過此方法來獲取一個最合適的view
  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    *  探究一下`- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event`的底層實現(xiàn):
  // 尋找最合適view
  // point:也是方法調(diào)用者坐標系上的點
  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
  {
// 1.判斷下自己能否接收觸摸事件
      if (self.userInteractionEnabled == NO || self.hidden == YES ||   self.alpha <= 0.01) return nil;
    // 2.判斷下點在不在當前控件上
    // 用pointInside方法判斷點在不在控件上,point這個必須是方法調(diào)用者坐標系上的點
    if ([self pointInside:point withEvent:event] == NO) return nil;
    // 3.從后往前遍歷自己的子控件
    int count = (int)self.subviews.count;
    for (int i = count - 1; i >= 0; i--) {
        // 取出子控件
        UIView *childV = self.subviews[i];
        // 把自己坐標系上點轉化成子控件坐標系上點
        CGPoint childP = [self convertPoint:point toView:childV];
        UIView *fitView = [childV hitTest:childP withEvent:event];
        // 如果找到最合適view就直接返回
        if (fitView) {
            return fitView;
        }
    }
    // 4.自己就是最合適view
    return self;
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容