前言:我們知道,當(dāng)發(fā)生點(diǎn)擊事件時(shí)贺辰,系統(tǒng)通過(guò)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
查找第一響應(yīng)者碘饼。找到之后觸發(fā)該響應(yīng)者的UIResponder中的touch方法睡腿。
- 以下分析系統(tǒng)如何實(shí)現(xiàn)的键畴,這是demo
數(shù)字對(duì)應(yīng)的是該View的tag蠢笋,以下實(shí)現(xiàn)中均點(diǎn)擊tag為104的View
- 首先我們觀察系統(tǒng)的打印結(jié)果抓艳,在
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
中添加如下代碼
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"hit start -- >%ld",self.tag);
UIView *v = [super hitTest:point withEvent:event];
NSLog(@"hit end %ld ->%@",self.tag,v);
return v;
}
- 打印結(jié)果如下
hit start -- >100
hit start -- >101
hit end 101 ->(null)
hit start -- >102
hit start -- >104
hit end 104 -><TestView: 0x7fb3a1f8ef80; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fb3a1f87190>>
hit end 102 -><TestView: 0x7fb3a1f8ef80; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fb3a1f87190>>
hit end 100 -><TestView: 0x7fb3a1f8ef80; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fb3a1f87190>>
hit start -- >100
hit start -- >101
hit end 101 ->(null)
hit start -- >102
hit start -- >104
hit end 104 -><TestView: 0x7fb3a1f8ef80; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fb3a1f87190>>
hit end 102 -><TestView: 0x7fb3a1f8ef80; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fb3a1f87190>>
hit end 100 -><TestView: 0x7fb3a1f8ef80; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fb3a1f87190>>
104 ->-[TestView touchesBegan:withEvent:]
- 以下是模仿系統(tǒng)實(shí)現(xiàn)的方法
- (UIView *)__adHitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (![self pointInside:point withEvent:event]) {
return nil;
}
if (self.userInteractionEnabled == NO) {
return nil;
}
if (self.alpha < 0.01) {
return nil;
}
if (self.hidden == YES) {
return nil;
}
if (self.subviews.count) {
for (NSUInteger i = self.subviews.count; i > 0; i--) {
UIView *sub = self.subviews[i-1];
CGPoint p = [self convertPoint:point toView:sub];
UIView *t = [sub hitTest:p withEvent:event];
if (t != nil) {
return t;
}
}
}
return self;
}
- 在
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
換成模仿的實(shí)現(xiàn)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"hit start -- >%ld",self.tag);
UIView *v = [self __adHitTest:point withEvent:event];
NSLog(@"hit end %ld ->%@",self.tag,v);
return v;
}
- 觀察模仿后的打印結(jié)果
hit start -- >100
hit start -- >101
hit end 101 ->(null)
hit start -- >102
hit start -- >104
hit end 104 -><TestView: 0x7fd22ac1d680; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fd22ac1d7f0>>
hit end 102 -><TestView: 0x7fd22ac1d680; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fd22ac1d7f0>>
hit end 100 -><TestView: 0x7fd22ac1d680; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fd22ac1d7f0>>
hit start -- >100
hit start -- >101
hit end 101 ->(null)
hit start -- >102
hit start -- >104
hit end 104 -><TestView: 0x7fd22ac1d680; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fd22ac1d7f0>>
hit end 102 -><TestView: 0x7fd22ac1d680; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fd22ac1d7f0>>
hit end 100 -><TestView: 0x7fd22ac1d680; frame = (29 89; 176 61); autoresize = RM+BM; tag = 104; layer = <CALayer: 0x7fd22ac1d7f0>>
104 ->-[TestView touchesBegan:withEvent:]