很多时候系统自带的tabBar不能满足我们的需求,这时我们就需要自定义tabBar,自定义tabBar步骤:
-
创建一个LHLTabBar继承自系统的UITabBar
- 在LHLTabBarController使用自定义的tabBar
LHLTabBar *tabBar = [[LHLTabBar alloc] init];
[self setValue:tabBar forKeyPath:@"tabBar"];
这里需要注意:
由于系统的tabBar是readOnly的,所以我们需要利用KVC对系统的tabBar进行赋值: KVC的原理是通过访问属性进行赋值,不是通过setter方法进行赋值
-
使用自定义的tabBar后,我们还需要验证一点,tabBar的tabBarButton是在什么时候添加的,如果在自定义之前就添加了,那么我们的自定义就毫无意义了,接下来在viewDidLoad和viewWillAppear两个方法中打印tabBar的tabBarButton:
从打印结果可看出,tabBar添加子控件按钮是在viewDidLoad之后,所以我们可以在viewDidLoad中自定义tabBar
- 自定义tabBar之后就应该在LHLTabBar中布局子控件了:plusButton是根据需求需要自定义的中间按钮,此处采用懒加载的方式
// 懒加载
- (UIButton *)plusButton{
if (_plusButton == nil) {
UIButton *plusButton = [UIButton buttonWithType:UIButtonTypeCustom];
[plusButton setBackgroundImage:[UIImage imageNamed:@"tabBar_publish_icon"] forState:UIControlStateNormal];
[plusButton setBackgroundImage:[UIImage imageNamed:@"tabBar_publish_click_icon"] forState:UIControlStateHighlighted];
[plusButton sizeToFit];
[self addSubview:plusButton];
_plusButton = plusButton;
}
return _plusButton;
}
- (void)layoutSubviews
{
[super layoutSubviews];
// 布局子控件
NSInteger count = self.items.count + 1;
CGFloat btnW = self.frame.size.width / count;
CGFloat btnH = self.frame.size.height;
NSInteger i = 0;
for (UIButton *tabBarButton in self.subviews) {
// 取出UITabBarButton
if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
if (i == 2) {
i += 1;
}
tabBarButton.frame = CGRectMake(btnW * i, 0, btnW, btnH);
i++;
}
}
// plusButton
self.plusButton.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
}
- 到此自定义的tabBar就完成了,效果图: