在日常运用app的过程中,经常能看到人家完成了底部分栏控制器的中心按钮凸起的作用,那么这是怎样完成的呢?

作用演示:

[iOS开发]iOS中TabBar中心按钮凸起的完成

完成原理:

创立按钮

创立一个UITabBar的子类,重写它的layoutSubviews办法:

- (void)layoutSubviews {
    [super layoutSubviews];
    CGFloat width = self.bp_width;
    // 添加发布按钮
    [self addSubview:self.publishButton];
    self.publishButton.center = CGPointMake(width * 0.5, 0);
    // 按钮索引
    int index = 0;
    // tabBar上按钮的尺寸
    CGFloat tabBarButtonW = (width - publishButtonWidth) / 2;
    CGFloat tabBarButtonH = [UIDevice bp_tabBarHeight];
    CGFloat tabBarButtonY = 0;
    // 设置TabBarButton的frame
    for (UIView *tabBarButton in self.subviews) {
        if (![NSStringFromClass(tabBarButton.class) isEqualToString:@"UITabBarButton"]) {
            continue;
        }
        // 核算按钮的X值
        CGFloat tabBarButtonX = index * tabBarButtonW;
        if (index == 1) { // 给下一个个button增加一个publushButton宽度的x值
            tabBarButtonX += publishButtonWidth;
        }
        // 设置按钮的frame
        tabBarButton.frame = CGRectMake(tabBarButtonX, tabBarButtonY, tabBarButtonW, tabBarButtonH);
        // 增加索引
        index++;
    }
}

办法里面对原有的tabBarButton的方位进行调整,以便把自己加上去的按钮插入到中心,把center方位设置成tabBar上沿的中心方位。

扩大点击规模

按钮加上去后,发现点击超出tabBar规模的方位,按钮无法呼应,所以,需求重写hitTest办法,扩大呼应规模:

// 重写扩大呼应规模
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
   if (self.isHidden == NO) {
       CGPoint newPoint = [self convertPoint:point toView:self.publishButton];
       if ([self.publishButton pointInside:newPoint withEvent:event]) {
           return self.publishButton;
       }
   }
    return [super hitTest:point withEvent:event];
}

这样,这个中心凸起的按钮就做好了!