// // KeyboardViewController.m // CustomKeyboard // // Created by Mac on 2025/10/27. // #import "KeyboardViewController.h" #import "KBKeyBoardMainView.h" #import "KBKey.h" #import "KBFunctionView.h" #import "Masonry.h" static CGFloat KEYBOARDHEIGHT = 256; @interface KeyboardViewController () @property (nonatomic, strong) UIButton *nextKeyboardButton; // 系统“下一个键盘”按钮(可选) @property (nonatomic, strong) KBKeyBoardMainView *keyBoardMainView; // 功能面板视图(点击工具栏第0个时显示) @property (nonatomic, strong) KBFunctionView *functionView; // 功能面板视图(点击工具栏第0个时显示) @end @implementation KeyboardViewController - (void)updateViewConstraints { [super updateViewConstraints]; // 可在此添加自定义尺寸约束 } - (void)viewDidLoad { [super viewDidLoad]; [self setupUI]; } - (void)setupUI { // 固定键盘整体高度 [self.view.heightAnchor constraintEqualToConstant:KEYBOARDHEIGHT].active = YES; // 预置功能面板(默认隐藏),与键盘区域共享相同布局 self.functionView.hidden = YES; [self.view addSubview:self.functionView]; [self.functionView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.view); make.top.equalTo(self.view).offset(4); make.bottom.equalTo(self.view.mas_bottom).offset(-4); }]; self.keyBoardMainView.delegate = self; [self.view addSubview:self.keyBoardMainView]; [self.keyBoardMainView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.view); make.top.equalTo(self.view).offset(4); make.bottom.equalTo(self.view.mas_bottom).offset(-4); }]; } #pragma mark - Private /// 切换显示功能面板/键盘主视图 - (void)showFunctionPanel:(BOOL)show { // 简单显隐切换,复用相同的布局区域 self.functionView.hidden = !show; self.keyBoardMainView.hidden = show; // 可选:把当前显示的视图置顶,避免层级遮挡 if (show) { [self.view bringSubviewToFront:self.functionView]; } else { [self.view bringSubviewToFront:self.keyBoardMainView]; } } // MARK: - KBKeyBoardMainViewDelegate - (void)keyBoardMainView:(KBKeyBoardMainView *)keyBoardMainView didTapKey:(KBKey *)key { switch (key.type) { case KBKeyTypeCharacter: [self.textDocumentProxy insertText:key.output ?: key.title ?: @""]; break; case KBKeyTypeBackspace: [self.textDocumentProxy deleteBackward]; break; case KBKeyTypeSpace: [self.textDocumentProxy insertText:@" "]; break; case KBKeyTypeReturn: [self.textDocumentProxy insertText:@"\n"]; break; case KBKeyTypeGlobe: [self advanceToNextInputMode]; break; case KBKeyTypeCustom: [self.textDocumentProxy insertText:@"[lang]"]; break; case KBKeyTypeModeChange: case KBKeyTypeShift: // 这些已在 KBKeyBoardMainView/KBKeyboardView 内部处理 break; } } - (void)keyBoardMainView:(KBKeyBoardMainView *)keyBoardMainView didTapToolActionAtIndex:(NSInteger)index { // 符合你的要求:由控制器来切换面板 if (index == 0) { [self showFunctionPanel:YES]; } else { [self showFunctionPanel:NO]; } } #pragma mark - lazy - (KBKeyBoardMainView *)keyBoardMainView{ if (!_keyBoardMainView) { _keyBoardMainView = [[KBKeyBoardMainView alloc] init]; } return _keyBoardMainView; } - (KBFunctionView *)functionView{ if (!_functionView) { _functionView = [[KBFunctionView alloc] init]; } return _functionView; } @end