iOS 自定义底部tabbar加号按钮实现方法

自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个“+号按钮”

1、自定义WBTabBar,让其继承自UITabBar,并定义点击事件代理方法。

.h方法里面

#import <UIKit/UIKit.h>

@class WXReleaseTabBar;

@protocol WXReleaseTabBarDelegate <WXReleaseTabBarDelegate>

@optional

- (void)tabBarDidClickPlusButton:(WXReleaseTabBar *)tabBar;

@end

@interface WXReleaseTabBar : UITabBar

@property (nonatomic, weak) id<WXReleaseTabBarDelegate> tabBarDelegate;

@end

.m方法里面

//定义一个按钮

@property (nonatomic, strong) UIButton *plusButton;

然后初始化

- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        UIButton *plusBtn = [[UIButton alloc] init];

        [plusBtn setBackgroundImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateNormal];

        [plusBtn setBackgroundImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateHighlighted];

        [plusBtn setImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateNormal];

        [plusBtn setImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateHighlighted];

        plusBtn.size = plusBtn.currentBackgroundImage.size;

        [plusBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:plusBtn];

        self.plusButton = plusBtn;

    }

    return self;

}

//添加约束

- (void)layoutSubviews

{

    [super layoutSubviews];

    CGFloat width = self.width;

    CGFloat height = self.height;

    self.plusButton.center = CGPointMake(width * 0.5, height * 0.5);

    CGRect tempRect = self.plusButton.frame;

    tempRect.origin.y =  -20;

    self.plusButton.frame = tempRect;

    int index = 0;

    CGFloat tabBarButtonW = width / 5;

    CGFloat tabBarButtonH = height;

    CGFloat tabBarButtonY = 0;

    

    for (UIView *tabBarButton in self.subviews) {

        if (![NSStringFromClass(tabBarButton.class) isEqualToString:@"UITabBarButton"]) continue;

        CGFloat tabBarButtonX = index * tabBarButtonW;

        if (index >= 2) {

            tabBarButtonX += tabBarButtonW;

        }

        tabBarButton.frame = CGRectMake(tabBarButtonX, tabBarButtonY, tabBarButtonW, tabBarButtonH);

        index++;

    }

    [self bringSubviewToFront:self.plusButton];

}

//重写系统的hitTest方法让处于tabbar外部的按钮部分也可以被点击

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    if (self.isHidden == NO) { // 当前界面 tabBar显示

        CGPoint newPoint = [self convertPoint:point toView:self.plusButton];

        if ( [self.plusButton pointInside:newPoint withEvent:event]) { // 点 属于按钮范围

            return self.plusButton;

        }else{

            return [super hitTest:point withEvent:event];

        }

    }else {

        return [super hitTest:point withEvent:event];

    }

}

 //被点击的方法

- (void)plusClick

{

    // 通知代理

    if ([self.tabBarDelegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {

        [self.tabBarDelegate tabBarDidClickPlusButton:self];

    }

}

2、tabBar是UITabBarController的只读成员变量(属性),是不让修改的,在UITabBarController.m中的操作如下:

@interface WXTabbarViewController ()<UITabBarDelegate>

 @end

3、然后在UITabBarController.m初始化里面我们可以使用KVC的方式,更换系统自带的UITabBar,实现代码如下:

xxxTabBar(自定义的tabbar) *tabBar = [[xxxTabBar alloc] init]; 

xxxTabBar.tabBarDelegate= self;
[self setValue:tabBar forKeyPath:@"tabBar"];

4、在UITabBarController.m实现点击的代理方法

- (void)tabBarDidClickPlusButton:(WXReleaseTabBar *)tabBar

{

    NSLog(@"发布按钮");

//    ComposeViewController *composeViewController= [[ComposeViewController alloc] init];

//    UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:composeViewController];

//    [self presentViewController:navigationController animated:YES completion:nil];

}

原文地址:https://www.cnblogs.com/FZP5/p/10019678.html