iOS 开发 oc 自定义tabbar的item有5个,中间一个为向上凸出的大按钮,点击凸出的部分UIView *result = [super hitTest

146 阅读1分钟

在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;

}