當我們單擊屏幕時,系統(tǒng)會記錄該次的觸摸事件蹬音,添加到Application的事件隊列中,然后從keyWindow開始依次向上尋找,結(jié)合響應(yīng)者的pointInside方法和hitTest方法找出處理該觸摸事件的View征椒,從而也形成一條事件響應(yīng)鏈。
//point是該視圖的坐標系上的點
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
//1.判斷自己能否接收觸摸時間
if (self.userInteractionEnabled==NO||self.hidden==YES||self.alpha<=0.01) {
return nil;
}
//2.判斷觸摸點在不在自己范圍內(nèi)
if (![self pointInside:point withEvent:event]) {
return nil;
}
//3.從后往前遍歷自己的子控件湃累,看是否有子控件更適合響應(yīng)此事件
NSInteger count = self.subviews.count;
for (NSInteger i = count-1; i>=0; i--) {
UIView* childView = self.subviews[i];
CGPoint childPoint = [self convertPoint:point toView:childView];
UIView* fitView = [childView hitTest:childPoint withEvent:event];
if (fitView) {
return fitView;
}
}
//4.沒有找到比自己更合適的view
return self;
}
應(yīng)用場景:處理多個UIScrollView的手勢沖突勃救,擴大UIButton的響應(yīng)范圍,這些都是通過重寫pointInside方法或者hitTest方法來實現(xiàn)的治力。