如上图这种点击
TabBar
中间Button
时present(模态)出控制器,而点击TabBar
其它的Button
则是苹果默认的直接切换视图的方式,现在很多APP都在使用,特别是直播APP,基本都把直播端模块放在这,最近在仿喵播时正好做到这,就想在网上找现成的框架,结果一直没找到能满足这种需求的框架,就自己动手写了一个,没有仔细打磨算不上框架,但绝对简单好用!
自定义TabBarController
实现原理很简单,无非是用自定义的Button
替换掉苹果自带的TabBar
上的Button
,一般目的是想TabBar
上方显示按钮图片,下面是文字;也就是每个Button
下面有一个Label
。实现这些的重点是计算Button
和Label
的宽度和X坐标值。
下面是JFTabBarController代码实现:
1、 新建三个类:
JFTabBar
继承自UIviewJFTabBarButton
继承自UIButtonJFTabBarController
继承自UITabBarController
2、具体代码:
- JFTabBar.h
#import <UIKit/UIKit.h>
@class JFTabBar;
@protocol JFTabBarDelegate <NSObject>
@optional
- (void)tabBar:(JFTabBar *)tabBar didSelectedButtonFrom:(int)from to:(int)to;
@end
@interface JFTabBar : UIView
- (void)addTabBarButtonWithItem:(UITabBarItem *)item;
- (void)customTheMiddleButtonWithImageName:(NSString *)imageName;
@property (nonatomic, weak) id<JFTabBarDelegate> delegate;
@end
- JFTabBar.m
#import "JFTabBar.h"
#import "JFTabBarButton.h"
//中间按钮被点击的通知
//此通知需要在JFTabBarController中监听
static NSString * const JFTabBarClickMiddleButtonDidNotification = @"JFTabBarClickMiddleButtonDidNotification";
@interface JFTabBar(){
CGFloat _buttonW;
}
@property (nonatomic, weak) JFTabBarButton *selectedButton;
@property (nonatomic, strong) UIButton *middleButton;
@end
@implementation JFTabBar
- (void)addTabBarButtonWithItem:(UITabBarItem *)item {
JFTabBarButton *button = [[JFTabBarButton alloc] init];
[self addSubview:button];
button.item = item;
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchDown];
if (self.subviews.count == 1) {
[self buttonClick:button];
}
}
- (void)buttonClick:(JFTabBarButton *)button {
if ([self.delegat