最近开发公司项目的时候,遇到了闲鱼界面中间按钮超过UITabBar部分,点击失效的问题,由于UITabBarController是由其他同事从github上搬下的代码,代码网址如下:
https://github.com/NoCodeNoWife/LLRiseTabBar-iOS
研究一下该代码,作者是把原来的UITabBar直接清掉,然后自定义了UIView加在UITabBarController上的tabBar上面,具体实现如下:
[self.tabBar addSubview:ziDingYiTabbar];
当上方是UITableView并且该tableView的cell点击之后又会跳转控制器时,就会造成点击中间按钮上方时,系统响应cell,而非tabBar的问题;
网上介绍的都是在自定义UITabBar的@implementation中重写- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法,在该方法中通过判断point在中间btn上时,放回btn作为响应对象.
但是实际情况是,点击按钮上方时,UITabBar的hitTest方法并没有响应,无法拦截点击方法;
研究了好久,发现上述作者采用清除系统自带UITabBar,在系统tabBar上添加自定义view实现的方法,无法在自定义的view中无法拦截hitTest方法;
尝试了很多方法,发现一种实现起来比较方便的方式:
1自定义继承至UITabBar的ziDingYiTabBar;
2在UITabBarController中用KVC得方式实现自定义的tabBar:
[self setValue:ziDingYiTabBar forKey:@"tabBar"];
3在自定义ziDingYiTabBar中重写- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法;
核心代码如下:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (self.isHidden == NO) {
CGPoint newP = [self convertPoint:point toView:self.emptyButton];
if ( [self.emptyButton pointInside:newP withEvent:event]) {
return self.emptyButton;
}else{
return [super hitTest:point withEvent:event];
}
}
else {
return [super hitTest:point withEvent:event];
}
}