UIView响应事件的两个方法

参考自:https://blog.csdn.net/mushaofeng1990/article/details/62434349

用户触摸屏幕后的事件传递过程:


//方法A
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ [super hitTest:point withEvent:event]; return nil; } //方法B -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ return YES; }

对view进行重写这两个方法后,就会发现,点击屏幕后,首先响应的是方法A

如果方法A中,我们没有调用父类的这个方法,那就根据这个方法A的返回view,作为响应事件的view。(当然返回nil,就是这个view不响应)

 

如果方法A中,我们调用了父类的这个方法,也就是

[super hitTest:point withEvent:event];那这个时候系统就要调用方法B;通过这个方法的返回值,来判断当前这个view能不能响应消息。

如果方法B返回的是no,那就不用再去遍历它的子视图。方法A返回的view就是可以响应事件的view。

如果方法B返回的是YES,那就去遍历它的子视图。(就是上图我们描述的那样,找到合适的view返回,如果找不到,那就由方法A返回的view去响应这个事件。)

 

因此总结下来:

//返回一个view来响应事件 (我们如果不想影响系统的事件传递链,在这个方法内,最好调用父类的这个方法)

- (nullableUIView *)hitTest:(CGPoint)point withEvent:(nullableUIEvent *)event;

//返回的值可以用来判断是否继续遍历子视图(返回的根据是触摸的point是否在view的frame范围内)

 

- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent *)event;

猜你喜欢

转载自www.cnblogs.com/liuw-flexi/p/8961033.html