// // KBFunctionBarView.m // CustomKeyboard // // Created by Mac on 2025/10/28. // 功能 - barview #import "KBFunctionBarView.h" #import "Masonry.h" @interface KBFunctionBarView () @property (nonatomic, strong) UIView *leftContainer; // 左侧按钮容器 @property (nonatomic, strong) UIView *rightContainer; // 右侧按钮容器 @property (nonatomic, strong) NSArray *leftButtonsInternal; @property (nonatomic, strong) NSArray *rightButtonsInternal; @end @implementation KBFunctionBarView - (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor clearColor]; _leftTitles = @[@"ABC"]; _rightTitles = @[@"Upgrade VIP"]; [self buildUI]; } return self; } #pragma mark - Public - (NSArray *)leftButtons { return self.leftButtonsInternal; } - (NSArray *)rightButtons { return self.rightButtonsInternal; } #pragma mark - UI - (void)buildUI { // 左右两个容器,方便分别布局 [self addSubview:self.leftContainer]; [self addSubview:self.rightContainer]; [self.rightContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.mas_right).offset(-12); make.centerY.equalTo(self.mas_centerY); make.height.mas_equalTo(36); }]; [self.leftContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.mas_left).offset(12); make.right.equalTo(self.rightContainer.mas_left).offset(-12); make.centerY.equalTo(self.mas_centerY); make.height.mas_equalTo(36); }]; // 左侧4个等宽按钮 NSMutableArray *leftBtns = [NSMutableArray arrayWithCapacity:4]; UIView *prev = nil; for (NSInteger i = 0; i < self.leftTitles.count; i++) { UIButton *btn = [self buildButtonWithTitle:(i < self.leftTitles.count ? self.leftTitles[i] : [NSString stringWithFormat:@"L%ld", (long)i])]; btn.tag = 100 + i; [btn addTarget:self action:@selector(onLeftTap:) forControlEvents:UIControlEventTouchUpInside]; [self.leftContainer addSubview:btn]; [btn mas_makeConstraints:^(MASConstraintMaker *make) { if (prev) { make.left.equalTo(prev.mas_right).offset(8); make.width.equalTo(prev); } else { make.left.equalTo(self.leftContainer.mas_left); } make.top.bottom.equalTo(self.leftContainer); }]; prev = btn; [leftBtns addObject:btn]; } [prev mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.leftContainer.mas_right); }]; self.leftButtonsInternal = leftBtns.copy; // 右侧N个按钮(靠右、两两等宽) NSMutableArray *rightBtns = [NSMutableArray arrayWithCapacity:3]; for (NSInteger i = 0; i < self.rightTitles.count; i++) { UIButton *btn = [self buildButtonWithTitle:(i < self.rightTitles.count ? self.rightTitles[i] : [NSString stringWithFormat:@"R%ld", (long)i])]; btn.tag = 200 + i; [self.rightContainer addSubview:btn]; [btn addTarget:self action:@selector(onRightTap:) forControlEvents:UIControlEventTouchUpInside]; [rightBtns addObject:btn]; } // 从右往左链式布局,保证整体靠右;支持 1/2/3... 任意数量 UIView *prevRight = nil; // 指向右侧已布局的按钮 for (NSInteger i = rightBtns.count - 1; i >= 0; i--) { UIButton *btn = rightBtns[i]; [btn mas_makeConstraints:^(MASConstraintMaker *make) { if (!prevRight) { // 最右侧按钮贴右 make.right.equalTo(self.rightContainer.mas_right); } else { // 其余按钮紧挨左侧兄弟,且与其等宽 make.right.equalTo(prevRight.mas_left).offset(-8); make.width.equalTo(prevRight); } make.top.bottom.equalTo(self.rightContainer); }]; prevRight = btn; } // 最左侧一个不超出容器左边(允许根据内容自然宽度收缩) if (prevRight) { [prevRight mas_makeConstraints:^(MASConstraintMaker *make) { make.left.greaterThanOrEqualTo(self.rightContainer.mas_left); }]; } self.rightButtonsInternal = rightBtns.copy; } #pragma mark - Actions - (void)onLeftTap:(UIButton *)sender { NSInteger idx = sender.tag - 100; if ([self.delegate respondsToSelector:@selector(functionBarView:didTapLeftAtIndex:)]) { [self.delegate functionBarView:self didTapLeftAtIndex:idx]; } } - (void)onRightTap:(UIButton *)sender { NSInteger idx = sender.tag - 200; if ([self.delegate respondsToSelector:@selector(functionBarView:didTapRightAtIndex:)]) { [self.delegate functionBarView:self didTapRightAtIndex:idx]; } } - (UIButton *)buildButtonWithTitle:(NSString *)title { UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; btn.layer.cornerRadius = 18; btn.layer.masksToBounds = YES; btn.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9]; btn.titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; [btn setTitle:title forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; return btn; } #pragma mark - Lazy - (UIView *)leftContainer { if (!_leftContainer) { _leftContainer = [[UIView alloc] init]; } return _leftContainer; } - (UIView *)rightContainer { if (!_rightContainer) { _rightContainer = [[UIView alloc] init]; } return _rightContainer; } @end