Files
keyboard/keyBoard/Class/Base/V/KBCustomTabBar.m
2026-02-09 16:53:30 +08:00

167 lines
5.0 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// KBCustomTabBar.m
// keyBoard
//
// Created by Assistant on 2026/01/16.
//
#import "KBCustomTabBar.h"
#import "Masonry.h"
@interface KBCustomTabBar ()
@property(nonatomic, strong) NSArray<UITabBarItem *> *items;
@property(nonatomic, strong) NSMutableArray<UIButton *> *buttons;
@property(nonatomic, strong) UIView *backgroundView;
@end
@implementation KBCustomTabBar
- (instancetype)initWithItems:(NSArray<UITabBarItem *> *)items {
self = [super initWithFrame:CGRectZero];
if (self) {
_items = items;
_selectedIndex = 0;
_buttons = [NSMutableArray array];
[self setupUI];
}
return self;
}
- (void)setupUI {
// 背景视图
self.backgroundView = [[UIView alloc] init];
self.backgroundView.backgroundColor = [UIColor whiteColor];
[self addSubview:self.backgroundView];
[self.backgroundView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
// 创建按钮
UIStackView *stackView = [[UIStackView alloc] init];
stackView.axis = UILayoutConstraintAxisHorizontal;
stackView.distribution = UIStackViewDistributionFillEqually;
stackView.alignment = UIStackViewAlignmentFill;
[self addSubview:stackView];
[stackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
for (NSInteger i = 0; i < self.items.count; i++) {
UITabBarItem *item = self.items[i];
UIButton *button = [self createButtonWithItem:item index:i];
[stackView addArrangedSubview:button];
[self.buttons addObject:button];
}
// 设置初始选中状态
[self updateButtonStates];
}
- (UIButton *)createButtonWithItem:(UITabBarItem *)item index:(NSInteger)index {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.tag = index;
// 设置图片
[button setImage:item.image forState:UIControlStateNormal];
[button setImage:item.selectedImage forState:UIControlStateSelected];
// 设置标题
[button setTitle:item.title forState:UIControlStateNormal];
[button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
button.titleLabel.font = [UIFont systemFontOfSize:10];
// 布局:图片在上,文字在下
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
// 调整图片和文字位置
CGFloat spacing = 4.0;
button.imageEdgeInsets = UIEdgeInsetsMake(-spacing, 0, spacing, 0);
button.titleEdgeInsets = UIEdgeInsetsMake(
spacing, -button.imageView.frame.size.width, -spacing, 0);
button.contentEdgeInsets = UIEdgeInsetsMake(spacing, 0, spacing, 0);
// 垂直排列
[button setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
[button
setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
[button addTarget:self
action:@selector(buttonTapped:)
forControlEvents:UIControlEventTouchUpInside];
return button;
}
- (void)buttonTapped:(UIButton *)button {
NSInteger index = button.tag;
if (index != self.selectedIndex) {
self.selectedIndex = index;
[self updateButtonStates];
if ([self.delegate respondsToSelector:@selector(customTabBar:
didSelectItemAtIndex:)]) {
[self.delegate customTabBar:self didSelectItemAtIndex:index];
}
}
}
- (void)setSelectedIndex:(NSInteger)selectedIndex animated:(BOOL)animated {
if (_selectedIndex != selectedIndex) {
_selectedIndex = selectedIndex;
[self updateButtonStates];
}
}
- (void)setSelectedIndex:(NSInteger)selectedIndex {
[self setSelectedIndex:selectedIndex animated:NO];
}
- (void)updateButtonStates {
for (NSInteger i = 0; i < self.buttons.count; i++) {
UIButton *button = self.buttons[i];
button.selected = (i == self.selectedIndex);
// 特殊处理社区按钮索引2选中时文字颜色为白色
if (i == 2 && button.selected) {
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
} else if (i == 2) {
[button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
}
}
}
- (void)setTransparentBackground:(BOOL)transparent {
if (transparent) {
self.backgroundView.backgroundColor = [UIColor clearColor];
} else {
self.backgroundView.backgroundColor = [UIColor whiteColor];
}
}
- (void)layoutSubviews {
[super layoutSubviews];
// 调整按钮的图片和文字布局
for (UIButton *button in self.buttons) {
CGFloat imageWidth = button.imageView.frame.size.width;
CGFloat imageHeight = button.imageView.frame.size.height;
CGFloat titleWidth = button.titleLabel.frame.size.width;
CGFloat titleHeight = button.titleLabel.frame.size.height;
CGFloat spacing = 4.0;
// 图片在上
button.imageEdgeInsets =
UIEdgeInsetsMake(-(titleHeight + spacing), 0, 0, -titleWidth);
// 文字在下
button.titleEdgeInsets =
UIEdgeInsetsMake(0, -imageWidth, -(imageHeight + spacing), 0);
}
}
@end