从手指接触屏幕,到app控件作出响应,就是一个完整的TouchEvent发生了。
通过控制TouchEvent流程,可以实现哪些基础需求:
- 增大控件响应范围;
- 阻断UIScrollView对事件的截取;
来看下整个过程:手指触摸->产生TouchEvent->发送给UIApplication寻找响应者响应。这里其实通过hitTest:WithEvent从下往上(从window到顶级视图)寻找一个在手指点击范围内并且可以响应事件的响应者;是否在点击范围根据pointInside来判断,所以如果你想要增大控件响应范围,可以重写这个方法。例如:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if (CGRectContainsPoint(CGRectMake(-10, -10, self.bounds.size.width + 20, self.bounds.size.height + 20), point)) {
return YES;
}
return NO;
}
上面这个就可以增加控件的响应范围,上下左右都延伸了10。
寻找最佳响应者方法:hitTest:withEvent:如果需要在UIScrollView子视图实现自定义touchBegin手势,那么需要在这个方法里做判断。当点击的视图是需要处理自定义的视图时,通知父视图即UIScrollView禁止滑动,否则自定义手势不执行;例如:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *view = [super hitTest:point withEvent:event];
if ([view isKindOfClass:[UIImageView class]]) {
if (self.virtualStickViewTouchImageView) {
//这里回调禁用滑动
self.virtualStickViewTouchImageView(YES);
}
}
return view;
}
未完待续。。。