This commit is contained in:
2025-10-28 14:30:03 +08:00
parent 1deca2ae5b
commit 377e88b6db
12 changed files with 688 additions and 42 deletions

View File

@@ -0,0 +1,27 @@
//
// KBFunctionBarView.h
// CustomKeyboard
//
// Created by Mac on 2025/10/28.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/// 功能区顶部的Bar左侧4个按钮右侧3个按钮
@interface KBFunctionBarView : UIView
/// 左侧4个按钮懒加载创建等宽水平排布
@property (nonatomic, strong, readonly) NSArray<UIButton *> *leftButtons;
/// 右侧3个按钮懒加载创建等宽水平排布靠右
@property (nonatomic, strong, readonly) NSArray<UIButton *> *rightButtons;
/// 配置按钮标题(可选)
@property (nonatomic, copy) NSArray<NSString *> *leftTitles; // 默认 @[@"帮回", @"会说", @"话术", @"更多"]
@property (nonatomic, copy) NSArray<NSString *> *rightTitles; // 默认 @[@"❤", @"收藏", @"宫格"]
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,142 @@
//
// 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<UIButton *> *leftButtonsInternal;
@property (nonatomic, strong) NSArray<UIButton *> *rightButtonsInternal;
@end
@implementation KBFunctionBarView
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor];
_leftTitles = @[@"帮回", @"会说", @"话术", @"更多"];
_rightTitles = @[@"❤", @"收藏", @"宫格"];
[self buildUI];
}
return self;
}
#pragma mark - Public
- (NSArray<UIButton *> *)leftButtons { return self.leftButtonsInternal; }
- (NSArray<UIButton *> *)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<UIButton *> *leftBtns = [NSMutableArray arrayWithCapacity:4];
UIView *prev = nil;
for (NSInteger i = 0; i < 4; i++) {
UIButton *btn = [self buildButtonWithTitle:(i < self.leftTitles.count ? self.leftTitles[i] : [NSString stringWithFormat:@"L%ld", (long)i])];
btn.tag = 100 + i;
[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;
// 3
NSMutableArray<UIButton *> *rightBtns = [NSMutableArray arrayWithCapacity:3];
UIView *next = nil;
for (NSInteger i = 0; i < 3; 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];
[rightBtns addObject:btn];
}
//
UIButton *r0 = rightBtns.count > 0 ? rightBtns[0] : nil;
UIButton *r1 = rightBtns.count > 1 ? rightBtns[1] : nil;
UIButton *r2 = rightBtns.count > 2 ? rightBtns[2] : nil;
if (r0 && r1 && r2) {
[r2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.rightContainer.mas_right);
make.top.bottom.equalTo(self.rightContainer);
}];
[r1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(r2.mas_left).offset(-8);
make.top.bottom.equalTo(self.rightContainer);
make.width.equalTo(r2);
}];
[r0 mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(r1.mas_left).offset(-8);
make.top.bottom.equalTo(self.rightContainer);
make.width.equalTo(r1);
make.left.greaterThanOrEqualTo(self.rightContainer.mas_left); //
}];
}
self.rightButtonsInternal = rightBtns.copy;
}
- (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

View File

@@ -0,0 +1,23 @@
//
// KBFunctionPasteView.h
// CustomKeyboard
//
// Created by Mac on 2025/10/28.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/// 粘贴提示输入框区域(左侧图标+占位文案,圆角白底)
@interface KBFunctionPasteView : UIView
/// 左侧图标
@property (nonatomic, strong, readonly) UIImageView *iconView;
/// 提示文案例如点击粘贴TA的话
@property (nonatomic, strong, readonly) UILabel *placeholderLabel;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,75 @@
//
// KBFunctionPasteView.m
// CustomKeyboard
//
// Created by Mac on 2025/10/28.
// View
#import "KBFunctionPasteView.h"
#import "Masonry.h"
@interface KBFunctionPasteView ()
@property (nonatomic, strong) UIImageView *iconViewInternal;
@property (nonatomic, strong) UILabel *placeholderLabelInternal;
@end
@implementation KBFunctionPasteView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
//
self.backgroundColor = [UIColor colorWithWhite:1 alpha:0.95];
self.layer.cornerRadius = 12.0;
self.layer.masksToBounds = YES;
[self addSubview:self.iconViewInternal];
[self addSubview:self.placeholderLabelInternal];
[self.iconViewInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(12);
make.centerY.equalTo(self.mas_centerY);
make.width.height.mas_equalTo(20);
}];
[self.placeholderLabelInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.iconViewInternal.mas_right).offset(8);
make.right.equalTo(self.mas_right).offset(-12);
make.centerY.equalTo(self.mas_centerY);
}];
}
return self;
}
#pragma mark - Lazy
- (UIImageView *)iconViewInternal {
if (!_iconViewInternal) {
_iconViewInternal = [[UIImageView alloc] init];
//
UILabel *emoji = [[UILabel alloc] init];
emoji.text = @"📋"; // /
emoji.font = [UIFont systemFontOfSize:18];
emoji.textAlignment = NSTextAlignmentCenter;
[_iconViewInternal addSubview:emoji];
[emoji mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_iconViewInternal);
}];
}
return _iconViewInternal;
}
- (UILabel *)placeholderLabelInternal {
if (!_placeholderLabelInternal) {
_placeholderLabelInternal = [[UILabel alloc] init];
_placeholderLabelInternal.text = @"点击粘贴TA的话";
_placeholderLabelInternal.textColor = [UIColor colorWithRed:0.20 green:0.64 blue:0.54 alpha:1.0];
_placeholderLabelInternal.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
}
return _placeholderLabelInternal;
}
#pragma mark - Expose
- (UIImageView *)iconView { return self.iconViewInternal; }
- (UILabel *)placeholderLabel { return self.placeholderLabelInternal; }
@end

View File

@@ -0,0 +1,23 @@
//
// KBFunctionTagCell.h
// CustomKeyboard
//
// Created by Codex on 2025/10/28.
// 话术标签Cell左图标+右标题,圆角灰白底
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface KBFunctionTagCell : UICollectionViewCell
/// 标题
@property (nonatomic, strong, readonly) UILabel *titleLabel;
/// 头像/图标
@property (nonatomic, strong, readonly) UIImageView *iconView;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,73 @@
//
// KBFunctionTagCell.m
// CustomKeyboard
//
// Created by Codex on 2025/10/28.
//
#import "KBFunctionTagCell.h"
#import "Masonry.h"
@interface KBFunctionTagCell ()
@property (nonatomic, strong) UILabel *titleLabelInternal;
@property (nonatomic, strong) UIImageView *iconViewInternal;
@end
@implementation KBFunctionTagCell
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.contentView.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
self.contentView.layer.cornerRadius = 12;
self.contentView.layer.masksToBounds = YES;
[self.contentView addSubview:self.iconViewInternal];
[self.contentView addSubview:self.titleLabelInternal];
[self.iconViewInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView.mas_left).offset(10);
make.centerY.equalTo(self.contentView.mas_centerY);
make.width.height.mas_equalTo(24);
}];
[self.titleLabelInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.iconViewInternal.mas_right).offset(6);
make.right.equalTo(self.contentView.mas_right).offset(-10);
make.centerY.equalTo(self.contentView.mas_centerY);
}];
}
return self;
}
#pragma mark - Lazy
- (UIImageView *)iconViewInternal {
if (!_iconViewInternal) {
_iconViewInternal = [[UIImageView alloc] init];
UILabel *emoji = [[UILabel alloc] init];
emoji.text = @"🙂"; //
emoji.textAlignment = NSTextAlignmentCenter;
emoji.font = [UIFont systemFontOfSize:20];
[_iconViewInternal addSubview:emoji];
[emoji mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_iconViewInternal);
}];
}
return _iconViewInternal;
}
- (UILabel *)titleLabelInternal {
if (!_titleLabelInternal) {
_titleLabelInternal = [[UILabel alloc] init];
_titleLabelInternal.font = [UIFont systemFontOfSize:15 weight:UIFontWeightSemibold];
_titleLabelInternal.textColor = [UIColor blackColor];
}
return _titleLabelInternal;
}
#pragma mark - Expose
- (UILabel *)titleLabel { return self.titleLabelInternal; }
- (UIImageView *)iconView { return self.iconViewInternal; }
@end

View File

@@ -0,0 +1,30 @@
//
// KBFunctionView.h
// CustomKeyboard
//
// Created by Mac on 2025/10/28.
//
#import <UIKit/UIKit.h>
@class KBFunctionBarView, KBFunctionPasteView;
NS_ASSUME_NONNULL_BEGIN
/// 整个功能面板视图顶部Bar + 粘贴区 + 标签列表 + 右侧操作按钮
@interface KBFunctionView : UIView
@property (nonatomic, strong, readonly) UICollectionView *collectionView; // 话术分类/标签列表
@property (nonatomic, strong, readonly) NSArray<NSString *> *items; // 简单数据源(演示用)
// 子视图暴露,便于外部接入事件
@property (nonatomic, strong, readonly) KBFunctionBarView *barView;
@property (nonatomic, strong, readonly) KBFunctionPasteView *pasteView;
@property (nonatomic, strong, readonly) UIButton *pasteButton; // 右侧-粘贴
@property (nonatomic, strong, readonly) UIButton *deleteButton; // 右侧-删除
@property (nonatomic, strong, readonly) UIButton *clearButton; // 右侧-清空
@property (nonatomic, strong, readonly) UIButton *sendButton; // 右侧-发送
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,263 @@
//
// KBFunctionView.m
// CustomKeyboard
//
// Created by Mac on 2025/10/28.
//
#import "KBFunctionView.h"
#import "KBFunctionBarView.h"
#import "KBFunctionPasteView.h"
#import "KBFunctionTagCell.h"
#import "Masonry.h"
static NSString * const kKBFunctionTagCellId = @"KBFunctionTagCellId";
@interface KBFunctionView () <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
// UI
@property (nonatomic, strong) KBFunctionBarView *barViewInternal;
@property (nonatomic, strong) KBFunctionPasteView *pasteViewInternal;
@property (nonatomic, strong) UICollectionView *collectionViewInternal;
@property (nonatomic, strong) UIView *rightButtonContainer; //
@property (nonatomic, strong) UIButton *pasteButtonInternal;
@property (nonatomic, strong) UIButton *deleteButtonInternal;
@property (nonatomic, strong) UIButton *clearButtonInternal;
@property (nonatomic, strong) UIButton *sendButtonInternal;
// Data
@property (nonatomic, strong) NSArray<NSString *> *itemsInternal;
@end
@implementation KBFunctionView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// 绿
self.backgroundColor = [UIColor colorWithRed:0.77 green:0.93 blue:0.82 alpha:1.0];
[self setupUI];
[self reloadDemoData];
}
return self;
}
#pragma mark - UI
- (void)setupUI {
// 1. Bar
[self addSubview:self.barViewInternal];
[self.barViewInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self.mas_top).offset(6);
make.height.mas_equalTo(48);
}];
//
[self addSubview:self.rightButtonContainer];
[self.rightButtonContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.mas_right).offset(-12);
make.top.equalTo(self.barViewInternal.mas_bottom).offset(8);
make.bottom.equalTo(self.mas_bottom).offset(-10);
make.width.mas_equalTo(72);
}];
//
[self.rightButtonContainer addSubview:self.pasteButtonInternal];
[self.rightButtonContainer addSubview:self.deleteButtonInternal];
[self.rightButtonContainer addSubview:self.clearButtonInternal];
[self.rightButtonContainer addSubview:self.sendButtonInternal];
//
CGFloat smallH = 44;
CGFloat bigH = 56;
CGFloat vSpace = 10;
[self.pasteButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.rightButtonContainer.mas_top);
make.left.right.equalTo(self.rightButtonContainer);
make.height.mas_equalTo(smallH);
}];
[self.deleteButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.pasteButtonInternal.mas_bottom).offset(vSpace);
make.left.right.equalTo(self.rightButtonContainer);
make.height.equalTo(self.pasteButtonInternal);
}];
[self.clearButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.deleteButtonInternal.mas_bottom).offset(vSpace);
make.left.right.equalTo(self.rightButtonContainer);
make.height.equalTo(self.pasteButtonInternal);
}];
[self.sendButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.clearButtonInternal.mas_bottom).offset(vSpace);
make.left.right.equalTo(self.rightButtonContainer);
make.height.mas_equalTo(bigH);
make.bottom.lessThanOrEqualTo(self.rightButtonContainer.mas_bottom); //
}];
// 2.
[self addSubview:self.pasteViewInternal];
[self.pasteViewInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(12);
make.right.equalTo(self.rightButtonContainer.mas_left).offset(-12);
make.top.equalTo(self.barViewInternal.mas_bottom).offset(8);
make.height.mas_equalTo(48);
}];
// 3. CollectionView
[self addSubview:self.collectionViewInternal];
[self.collectionViewInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(12);
make.right.equalTo(self.rightButtonContainer.mas_left).offset(-12);
make.top.equalTo(self.pasteViewInternal.mas_bottom).offset(10);
make.bottom.equalTo(self.mas_bottom).offset(-10);
}];
}
#pragma mark - Data
- (void)reloadDemoData {
//
self.itemsInternal = @[@"高情商", @"暖味拉扯", @"风趣幽默", @"撩女生", @"社交惬匿", @"情场高手", @"一枚暖男", @"聊天搭子", @"表达爱意", @"更多话术"];
[self.collectionViewInternal reloadData];
}
#pragma mark - UICollectionView
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return self.itemsInternal.count;
}
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
KBFunctionTagCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kKBFunctionTagCellId forIndexPath:indexPath];
cell.titleLabel.text = self.itemsInternal[indexPath.item];
return cell;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
//
CGFloat totalW = collectionView.bounds.size.width;
CGFloat space = 10.0;
NSInteger columns = 3;
CGFloat width = floor((totalW - space * (columns - 1)) / columns);
return CGSizeMake(width, 48);
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
return 10.0;
}
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
return 12.0;
}
#pragma mark - Button Actions
- (void)onTapPaste { NSLog(@"点击:粘贴"); }
- (void)onTapDelete { NSLog(@"点击:删除"); }
- (void)onTapClear { NSLog(@"点击:清空"); }
- (void)onTapSend { NSLog(@"点击:发送"); }
#pragma mark - Lazy
- (KBFunctionBarView *)barViewInternal {
if (!_barViewInternal) {
_barViewInternal = [[KBFunctionBarView alloc] init];
}
return _barViewInternal;
}
- (KBFunctionPasteView *)pasteViewInternal {
if (!_pasteViewInternal) {
_pasteViewInternal = [[KBFunctionPasteView alloc] init];
}
return _pasteViewInternal;
}
- (UICollectionView *)collectionViewInternal {
if (!_collectionViewInternal) {
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.sectionInset = UIEdgeInsetsZero; //
_collectionViewInternal = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
_collectionViewInternal.backgroundColor = [UIColor clearColor];
_collectionViewInternal.dataSource = self;
_collectionViewInternal.delegate = self;
[_collectionViewInternal registerClass:[KBFunctionTagCell class] forCellWithReuseIdentifier:kKBFunctionTagCellId];
}
return _collectionViewInternal;
}
- (UIView *)rightButtonContainer {
if (!_rightButtonContainer) {
_rightButtonContainer = [[UIView alloc] init];
_rightButtonContainer.backgroundColor = [UIColor clearColor];
}
return _rightButtonContainer;
}
- (UIButton *)buildRightButtonWithTitle:(NSString *)title color:(UIColor *)color {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.backgroundColor = color;
btn.layer.cornerRadius = 12.0;
btn.layer.masksToBounds = YES;
btn.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
[btn setTitle:title forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
return btn;
}
- (UIButton *)pasteButtonInternal {
if (!_pasteButtonInternal) {
_pasteButtonInternal = [self buildRightButtonWithTitle:@"粘贴" color:[UIColor colorWithRed:0.13 green:0.73 blue:0.60 alpha:1.0]];
[_pasteButtonInternal addTarget:self action:@selector(onTapPaste) forControlEvents:UIControlEventTouchUpInside];
}
return _pasteButtonInternal;
}
- (UIButton *)deleteButtonInternal {
if (!_deleteButtonInternal) {
//
_deleteButtonInternal = [UIButton buttonWithType:UIButtonTypeSystem];
_deleteButtonInternal.backgroundColor = [UIColor colorWithWhite:0.92 alpha:1.0];
_deleteButtonInternal.layer.cornerRadius = 12.0;
_deleteButtonInternal.layer.masksToBounds = YES;
_deleteButtonInternal.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
[_deleteButtonInternal setTitle:@"删除" forState:UIControlStateNormal];
[_deleteButtonInternal setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_deleteButtonInternal addTarget:self action:@selector(onTapDelete) forControlEvents:UIControlEventTouchUpInside];
}
return _deleteButtonInternal;
}
- (UIButton *)clearButtonInternal {
if (!_clearButtonInternal) {
_clearButtonInternal = [UIButton buttonWithType:UIButtonTypeSystem];
_clearButtonInternal.backgroundColor = [UIColor colorWithWhite:0.92 alpha:1.0];
_clearButtonInternal.layer.cornerRadius = 12.0;
_clearButtonInternal.layer.masksToBounds = YES;
_clearButtonInternal.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
[_clearButtonInternal setTitle:@"清空" forState:UIControlStateNormal];
[_clearButtonInternal setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_clearButtonInternal addTarget:self action:@selector(onTapClear) forControlEvents:UIControlEventTouchUpInside];
}
return _clearButtonInternal;
}
- (UIButton *)sendButtonInternal {
if (!_sendButtonInternal) {
_sendButtonInternal = [self buildRightButtonWithTitle:@"发送" color:[UIColor colorWithRed:0.13 green:0.73 blue:0.60 alpha:1.0]];
[_sendButtonInternal addTarget:self action:@selector(onTapSend) forControlEvents:UIControlEventTouchUpInside];
}
return _sendButtonInternal;
}
#pragma mark - Expose
- (UICollectionView *)collectionView { return self.collectionViewInternal; }
- (NSArray<NSString *> *)items { return self.itemsInternal; }
- (KBFunctionBarView *)barView { return self.barViewInternal; }
- (KBFunctionPasteView *)pasteView { return self.pasteViewInternal; }
- (UIButton *)pasteButton { return self.pasteButtonInternal; }
- (UIButton *)deleteButton { return self.deleteButtonInternal; }
- (UIButton *)clearButton { return self.clearButtonInternal; }
- (UIButton *)sendButton { return self.sendButtonInternal; }
@end

View File

@@ -2,7 +2,7 @@
// KBToolBar.h
// CustomKeyboard
//
// Created by Mac on 2025/10/27.
// Created by Mac on 2025/10/28.
//
#import <UIKit/UIKit.h>

View File

@@ -2,7 +2,7 @@
// KBToolBar.m
// CustomKeyboard
//
// Created by Mac on 2025/10/27.
// Created by Mac on 2025/10/28.
//
#import "KBToolBar.h"