什么是響應鏈和事件分發(fā):
- 響應鏈:由響應者對象構成鏈狀結(jié)構,能夠響應點擊哪替、拖拽等事件
- 事件分發(fā):屏幕捕捉到觸摸事件阱扬,包裝成UITouch和UIEvent對象框咙,加入到UIApplication管理的事件隊列中,然后按照一定的機制先將事件分發(fā)到keyWindow簿姨,然后按照視圖結(jié)構一層層分發(fā)下去距误,直到找到最適合view的過程簸搞。
響應者結(jié)構圖:
WX20180516-162401@2x.png=100x100
事件分發(fā)和響應過程:
- 從UIApplication對象分發(fā)事件開始,按照視圖結(jié)構尋找最合適的響應者准潭。調(diào)用的機制如下代碼所示:
// 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.從后往前遍歷自己的子控件趁俊,看是否有子控件更適合響應此事件
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;
}
}
// 沒有找到比自己更合適的view
return self;
}
找到最合適的view后,然后調(diào)用touchesBegan: withEvent:響應點擊事件刑然,在這個方法中寺擂,我們可以攔截事件,進行操作闰集。代碼實現(xiàn)如下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
}