在iOS开发中自定义TabBar,并使中间的按钮向上凸出,确实会遇到点击事件无法正确响应的问题。
问题分析
当自定义TabBar时,中间的凸起按钮部分可能会超出TabBar的边界。由于默认情况下,超出父视图边界的子视图不会响应点击事件(因为父视图的pointInside:withEvent:方法会返回NO),因此需要重写hitTest:withEvent:方法来确保这些超出部分也能正确响应点击事件。
解决方案
重写hitTest:withEvent:方法
在自定义的TabBar类中重写hitTest:withEvent:方法,确保点击事件能够传递到中间凸起的按钮上。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// 判断当前视图是否能接收事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {
return nil;
}
// 判断当前点是否在当前视图内
if (![self pointInside:point withEvent:event]) {
return nil;
}
// 从后往前遍历子视图
for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *fitView = [subview hitTest:subPoint withEvent:event];
if (fitView) {
return fitView;
}
}
// 如果没有找到合适的子视图,则返回自身
return self;
}