点击事件穿透:
有这样的需求:一个控件的某个部分被另外一个控件遮挡住,当点击这个重叠部分时,需要响应被遮盖控件的点击事件,就如下图所示:点击事件穿透指的是点击当前视图,但是实际上被选中的是其他视图。举个例子,上图效果图中有两个按钮,当点击不重合的地方,显示的是点击当前视图,当点击重合地方时,点击的是下方的视图。
如此效果,需要用到点击穿透事件:重写系统- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGPoint bluePoint = [self convertPoint:point toView:self.blueButton];
if ([self.blueButton pointInside:bluePoint withEvent:event]) {
return self.blueButton;
}else {
return [super hitTest:point withEvent:event];
}
}
此时再点击重合的区域,响应的是A按钮的事件。
扩大视图的响应区域
扩大视图的响应区域指的是点击当前视图区域外的位置,仍然显示的是点击当前视图。举个例子,下方效果图中黄色部分是按钮,红色部分是按钮外的区域,但是点击红色部分,仍能显示点击黄色按钮。
扩大视图响应区域的本质是判断所点击的点是否在于你想要扩大的区域上。在这里,我所设置的扩大区域是边线外增加30。实现如下:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGFloat min_x = -30.0;
CGFloat min_y = -30.0;
CGFloat max_x = self.frame.size.width + 30;
CGFloat max_y = self.frame.size.height + 30;
if (point.x <= max_x && point.x >= min_x && point.y <= max_y && point.y >= min_y) {
point = CGPointMake(0, 0);
return [super hitTest:point withEvent:event];
}else {
return [super hitTest:point withEvent:event];
}
}