You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.1 KiB
94 lines
3.1 KiB
//
|
|
// CommonTabBar.m
|
|
// HC
|
|
//
|
|
// Created by huilinLi on 2025/11/25.
|
|
//
|
|
|
|
#import "CommonTabBar.h"
|
|
|
|
@interface CommonTabBar ()
|
|
@property (nonatomic, strong) NSArray<UIButton *> *tabButtons;
|
|
@end
|
|
|
|
@implementation CommonTabBar
|
|
|
|
- (instancetype)initWithTabItems:(NSArray<NSDictionary *> *)tabItems {
|
|
self = [super init];
|
|
if (self) {
|
|
self.backgroundColor = [UIColor blackColor];
|
|
self.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[self setupTabButtonsWithItems:tabItems];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)setupTabButtonsWithItems:(NSArray<NSDictionary *> *)tabItems {
|
|
NSMutableArray<UIButton *> *buttons = [NSMutableArray array];
|
|
|
|
for (NSInteger i = 0; i < tabItems.count; i++) {
|
|
NSDictionary *item = tabItems[i];
|
|
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
|
|
|
|
UIButtonConfiguration *config = [UIButtonConfiguration plainButtonConfiguration];
|
|
config.image = [UIImage systemImageNamed:item[@"icon"] ?: @""];
|
|
config.title = item[@"title"];
|
|
config.imagePlacement = NSDirectionalRectEdgeTop;
|
|
config.imagePadding = 5;
|
|
btn.configuration = config;
|
|
|
|
BOOL selected = [item[@"selected"] boolValue];
|
|
btn.tintColor = selected ? [UIColor blueColor] : [UIColor whiteColor];
|
|
btn.titleLabel.font = [UIFont systemFontOfSize:10];
|
|
btn.tag = i;
|
|
|
|
[btn addTarget:self action:@selector(tabButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
[self addSubview:btn];
|
|
[buttons addObject:btn];
|
|
}
|
|
|
|
self.tabButtons = buttons;
|
|
[self setupTabButtonConstraints];
|
|
}
|
|
|
|
- (void)setupTabButtonConstraints {
|
|
for (NSInteger i = 0; i < self.tabButtons.count; i++) {
|
|
UIButton *btn = self.tabButtons[i];
|
|
btn.translatesAutoresizingMaskIntoConstraints = NO;
|
|
|
|
[NSLayoutConstraint activateConstraints:@[
|
|
[btn.widthAnchor constraintEqualToAnchor:self.widthAnchor multiplier:1.0/self.tabButtons.count],
|
|
[btn.heightAnchor constraintEqualToAnchor:self.heightAnchor],
|
|
[btn.centerYAnchor constraintEqualToAnchor:self.centerYAnchor],
|
|
|
|
(i == 0) ? [btn.leadingAnchor constraintEqualToAnchor:self.leadingAnchor] :
|
|
[btn.leadingAnchor constraintEqualToAnchor:self.tabButtons[i-1].trailingAnchor],
|
|
]];
|
|
}
|
|
|
|
// TabBar自身高度
|
|
[self.heightAnchor constraintEqualToConstant:60].active = YES;
|
|
}
|
|
|
|
- (void)tabButtonTapped:(UIButton *)sender {
|
|
self.selectedIndex = sender.tag;
|
|
|
|
for (UIButton *btn in self.tabButtons) {
|
|
btn.tintColor = (btn.tag == sender.tag) ? [UIColor blueColor] : [UIColor whiteColor];
|
|
}
|
|
|
|
if ([self.delegate respondsToSelector:@selector(tabBarDidSelectIndex:)]) {
|
|
[self.delegate tabBarDidSelectIndex:sender.tag];
|
|
}
|
|
}
|
|
|
|
// 外部设置选中索引时更新样式
|
|
- (void)setSelectedIndex:(NSInteger)selectedIndex {
|
|
_selectedIndex = selectedIndex;
|
|
for (UIButton *btn in self.tabButtons) {
|
|
btn.tintColor = (btn.tag == selectedIndex) ? [UIColor blueColor] : [UIColor whiteColor];
|
|
}
|
|
}
|
|
|
|
@end
|