自定义tabbar,使中间的按钮凸起。
下面是效果图。

直接上代码
KBTabbar是自定义的继承系统的UITabbar的
KBTabbar.h
@interface KBTabbar : UITabBar
@property (nonatomic, strong) UIButton *centerBtn; //中间凸起按钮
@end
KBTabbar.m
@implementation KBTabbar
- (instancetype)init
{
self = [super init];
if (self)
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:[UIImage imageNamed:@"plus_Last"] forState:UIControlStateNormal];
btn.bounds = CGRectMake(0, 0, 64, 64);
self.centerBtn = btn;
[self addSubview:btn];
}
return self;
}
- (void)layoutSubviews
{
[super layoutSubviews];
self.centerBtn.center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.3);
int index = 0;
CGFloat wigth = self.bounds.size.width / 5;
//通过遍历tabbar的字视图,重新布局tabbar上的按钮
for (UIView* sub in self.subviews) {
if ([sub isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
sub.frame = CGRectMake(index * wigth, self.bounds.origin.y, wigth, self.bounds.size.height - 2);
index++;
//index == 2 证明是中间的button ,不做任何操作,空出来
if (index == 2) {
index++;
}
}
}
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (self.isHidden == NO) {
//由于凸起的按钮上部分超出父视图,不会响应本身事件。所有在hitTest方法,使凸起按钮响应把自身事件。
CGPoint newPoint = [self convertPoint:point toView:self.centerBtn];
if ( [self.centerBtn pointInside:newPoint withEvent:event]) {
return self.centerBtn;
}else{
return [super hitTest:point withEvent:event];
}
}
else {
return [super hitTest:point withEvent:event];
}
}
上面就是自定制的tabbar,下面我们通过kvc来替换掉系统的tabbar。
1、创建继承UITabBarController的KBTabbarController
//KBTabbarController.h
@interface KBTabbarController : UITabBarController
@end
2、在m文件中替换tabbar
@interface KBTabbarController ()
@end
@implementation KBTabbarController
- (void)viewDidLoad {
[super viewDidLoad];
OneViewController *hvc = [[OneViewController alloc] init];
[self addChildController:hvc title:@"首页" imageName:@"tab1-heartshow" selectedImageName:@"tab1-heart" navVc:[UINavigationController class]];
TwoViewController *fvc = [[TwoViewController alloc] init];
[self addChildController:fvc title:@"活动" imageName:@"tab2-doctor" selectedImageName:@"tab2-doctorshow" navVc:[UINavigationController class]];
ThreeViewController *MoreVc = [[ThreeViewController alloc] init];
[self addChildController:MoreVc title:@"更多" imageName:@"tab4-more" selectedImageName:@"tab4-moreshow" navVc:[UINavigationController class]];
FourViewController *svc = [[FourViewController alloc] init];
[self addChildController:svc title:@"设置" imageName:@"tab5-file" selectedImageName:@"tab5-fileshow" navVc:[UINavigationController class]];
[[UITabBar appearance] setBackgroundImage:[self imageWithColor:[UIColor whiteColor]]];
// 设置tabbar
[[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
// 设置自定义的tabbar
[self setCustomtabbar];
}
- (void)setCustomtabbar{
KBTabbar *tabbar = [[KBTabbar alloc]init];
[self setValue:tabbar forKeyPath:@"tabBar"];
[tabbar.centerBtn addTarget:self action:@selector(centerBtnClick:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)centerBtnClick:(UIButton *)btn{
NSLog(@"点击了中间");
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"点击了中间按钮" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
}
- (void)addChildController:(UIViewController*)childController title:(NSString*)title imageName:(NSString*)imageName selectedImageName:(NSString*)selectedImageName navVc:(Class)navVc
{
childController.title = title;
childController.tabBarItem.image = [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
childController.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
// 设置一下选中tabbar文字颜色
[childController.tabBarItem setTitleTextAttributes:@{ NSForegroundColorAttributeName : [UIColor darkGrayColor] }forState:UIControlStateSelected];
UINavigationController* nav = [[navVc alloc] initWithRootViewController:childController];
[self addChildViewController:nav];
}
- (UIImage *)imageWithColor:(UIColor *)color{
// 一个像素
CGRect rect = CGRectMake(0, 0, 1, 1);
// 开启上下文
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
[color setFill];
UIRectFill(rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
网友评论