2026-02-24 13:38:51 +08:00
|
|
|
|
//
|
|
|
|
|
|
// KeyboardViewController+Private.h
|
|
|
|
|
|
// CustomKeyboard
|
|
|
|
|
|
//
|
|
|
|
|
|
// Created by Codex on 2026/02/22.
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#import "KeyboardViewController.h"
|
|
|
|
|
|
#import "Masonry.h"
|
|
|
|
|
|
|
|
|
|
|
|
@class AVAudioPlayer;
|
|
|
|
|
|
@class CAGradientLayer;
|
|
|
|
|
|
@class KBChatMessage;
|
|
|
|
|
|
@class KBChatPanelView;
|
|
|
|
|
|
@class KBFunctionView;
|
|
|
|
|
|
@class KBKeyBoardMainView;
|
|
|
|
|
|
@class KBKeyboardSubscriptionView;
|
|
|
|
|
|
@class KBSettingView;
|
|
|
|
|
|
@class KBSuggestionEngine;
|
|
|
|
|
|
|
|
|
|
|
|
@protocol KBChatLimitPopViewDelegate;
|
|
|
|
|
|
@protocol KBChatPanelViewDelegate;
|
|
|
|
|
|
@protocol KBFunctionViewDelegate;
|
|
|
|
|
|
@protocol KBKeyBoardMainViewDelegate;
|
|
|
|
|
|
@protocol KBKeyboardSubscriptionViewDelegate;
|
|
|
|
|
|
|
|
|
|
|
|
typedef NS_ENUM(NSInteger, KBKeyboardPanelMode) {
|
|
|
|
|
|
KBKeyboardPanelModeMain = 0,
|
|
|
|
|
|
KBKeyboardPanelModeFunction,
|
|
|
|
|
|
KBKeyboardPanelModeChat,
|
|
|
|
|
|
KBKeyboardPanelModeSettings,
|
|
|
|
|
|
KBKeyboardPanelModeSubscription,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
@interface KeyboardViewController () <KBKeyBoardMainViewDelegate,
|
|
|
|
|
|
KBFunctionViewDelegate,
|
|
|
|
|
|
KBKeyboardSubscriptionViewDelegate,
|
|
|
|
|
|
KBChatPanelViewDelegate,
|
|
|
|
|
|
KBChatLimitPopViewDelegate>
|
|
|
|
|
|
{
|
|
|
|
|
|
UIButton *_nextKeyboardButton;
|
|
|
|
|
|
UIView *_contentView;
|
|
|
|
|
|
KBKeyBoardMainView *_keyBoardMainView;
|
|
|
|
|
|
KBFunctionView *_functionView;
|
|
|
|
|
|
KBSettingView *_settingView;
|
|
|
|
|
|
UIImageView *_bgImageView;
|
|
|
|
|
|
KBChatPanelView *_chatPanelView;
|
|
|
|
|
|
KBKeyboardSubscriptionView *_subscriptionView;
|
|
|
|
|
|
KBSuggestionEngine *_suggestionEngine;
|
|
|
|
|
|
NSString *_currentWord;
|
|
|
|
|
|
UIControl *_chatLimitMaskView;
|
|
|
|
|
|
MASConstraint *_contentWidthConstraint;
|
|
|
|
|
|
MASConstraint *_contentHeightConstraint;
|
|
|
|
|
|
MASConstraint *_keyBoardMainHeightConstraint;
|
|
|
|
|
|
MASConstraint *_chatPanelHeightConstraint;
|
|
|
|
|
|
NSLayoutConstraint *_kb_heightConstraint;
|
|
|
|
|
|
NSLayoutConstraint *_kb_widthConstraint;
|
|
|
|
|
|
CGFloat _kb_lastPortraitWidth;
|
|
|
|
|
|
CGFloat _kb_lastKeyboardHeight;
|
|
|
|
|
|
UIImage *_kb_cachedGradientImage;
|
|
|
|
|
|
CGSize _kb_cachedGradientSize;
|
|
|
|
|
|
CAGradientLayer *_kb_defaultGradientLayer;
|
|
|
|
|
|
NSString *_kb_lastAppliedThemeKey;
|
|
|
|
|
|
NSMutableArray<KBChatMessage *> *_chatMessages;
|
|
|
|
|
|
AVAudioPlayer *_chatAudioPlayer;
|
|
|
|
|
|
BOOL _suppressSuggestions;
|
|
|
|
|
|
BOOL _chatPanelVisible;
|
|
|
|
|
|
NSString *_chatPanelBaselineText;
|
|
|
|
|
|
id _kb_fullAccessObserverToken;
|
|
|
|
|
|
id _kb_skinObserverToken;
|
2026-03-05 17:42:50 +08:00
|
|
|
|
id _kb_localizationObserverToken;
|
2026-02-24 13:38:51 +08:00
|
|
|
|
KBKeyboardPanelMode _kb_panelMode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@property(nonatomic, strong)
|
|
|
|
|
|
UIButton *nextKeyboardButton; // 系统“下一个键盘”按钮(可选)
|
|
|
|
|
|
@property(nonatomic, strong) UIView *contentView;
|
|
|
|
|
|
@property(nonatomic, strong) KBKeyBoardMainView
|
|
|
|
|
|
*keyBoardMainView; // 功能面板视图(点击工具栏第0个时显示)
|
|
|
|
|
|
@property(nonatomic, strong)
|
|
|
|
|
|
KBFunctionView *functionView; // 功能面板视图(点击工具栏第0个时显示)
|
|
|
|
|
|
@property(nonatomic, strong) KBSettingView *settingView; // 设置页
|
|
|
|
|
|
@property(nonatomic, strong) UIImageView *bgImageView; // 背景图(在底层)
|
|
|
|
|
|
@property(nonatomic, strong) KBChatPanelView *chatPanelView;
|
|
|
|
|
|
@property(nonatomic, strong) KBKeyboardSubscriptionView *subscriptionView;
|
|
|
|
|
|
@property(nonatomic, strong) KBSuggestionEngine *suggestionEngine;
|
|
|
|
|
|
@property(nonatomic, copy) NSString *currentWord;
|
|
|
|
|
|
@property(nonatomic, assign) BOOL suppressSuggestions;
|
|
|
|
|
|
@property(nonatomic, strong) UIControl *chatLimitMaskView;
|
|
|
|
|
|
@property(nonatomic, strong) MASConstraint *contentWidthConstraint;
|
|
|
|
|
|
@property(nonatomic, strong) MASConstraint *contentHeightConstraint;
|
|
|
|
|
|
@property(nonatomic, strong) MASConstraint *keyBoardMainHeightConstraint;
|
|
|
|
|
|
@property(nonatomic, strong) MASConstraint *chatPanelHeightConstraint;
|
|
|
|
|
|
@property(nonatomic, strong) NSLayoutConstraint *kb_heightConstraint;
|
|
|
|
|
|
@property(nonatomic, strong) NSLayoutConstraint *kb_widthConstraint;
|
|
|
|
|
|
@property(nonatomic, assign) CGFloat kb_lastPortraitWidth;
|
|
|
|
|
|
@property(nonatomic, assign) CGFloat kb_lastKeyboardHeight;
|
|
|
|
|
|
@property(nonatomic, strong) UIImage *kb_cachedGradientImage;
|
|
|
|
|
|
@property(nonatomic, assign) CGSize kb_cachedGradientSize;
|
|
|
|
|
|
@property(nonatomic, strong, nullable) CAGradientLayer *kb_defaultGradientLayer;
|
|
|
|
|
|
@property(nonatomic, copy, nullable) NSString *kb_lastAppliedThemeKey;
|
|
|
|
|
|
@property(nonatomic, strong) NSMutableArray<KBChatMessage *> *chatMessages;
|
|
|
|
|
|
@property(nonatomic, strong) AVAudioPlayer *chatAudioPlayer;
|
|
|
|
|
|
@property(nonatomic, assign) BOOL chatPanelVisible;
|
|
|
|
|
|
@property(nonatomic, copy) NSString *chatPanelBaselineText; // 打开聊天面板时宿主输入框已有的文本
|
|
|
|
|
|
@property(nonatomic, strong, nullable) id kb_fullAccessObserverToken;
|
|
|
|
|
|
@property(nonatomic, strong, nullable) id kb_skinObserverToken;
|
2026-03-05 17:42:50 +08:00
|
|
|
|
@property(nonatomic, strong, nullable) id kb_localizationObserverToken;
|
2026-02-24 13:38:51 +08:00
|
|
|
|
@property(nonatomic, assign) KBKeyboardPanelMode kb_panelMode;
|
2026-03-02 14:39:47 +08:00
|
|
|
|
@property(nonatomic, strong, nullable) id kb_appGroupObserverToken;
|
2026-02-24 13:38:51 +08:00
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
@interface KeyboardViewController (KBPrivate)
|
|
|
|
|
|
|
|
|
|
|
|
// UI
|
|
|
|
|
|
- (void)setupUI;
|
|
|
|
|
|
- (nullable KBFunctionView *)kb_functionViewIfCreated;
|
|
|
|
|
|
|
|
|
|
|
|
// Panels
|
|
|
|
|
|
- (void)showFunctionPanel:(BOOL)show;
|
|
|
|
|
|
- (void)showSettingView:(BOOL)show;
|
|
|
|
|
|
- (void)showChatPanel:(BOOL)show;
|
|
|
|
|
|
- (void)showSubscriptionPanel;
|
|
|
|
|
|
- (void)hideSubscriptionPanel;
|
|
|
|
|
|
- (void)kb_setPanelMode:(KBKeyboardPanelMode)mode animated:(BOOL)animated;
|
|
|
|
|
|
- (void)kb_ensureFunctionViewIfNeeded;
|
|
|
|
|
|
- (void)kb_ensureChatPanelViewIfNeeded;
|
|
|
|
|
|
- (void)kb_ensureKeyBoardMainViewIfNeeded;
|
|
|
|
|
|
- (void)kb_releaseMemoryWhenKeyboardHidden;
|
|
|
|
|
|
|
|
|
|
|
|
// Suggestions
|
|
|
|
|
|
- (void)kb_updateCurrentWordWithInsertedText:(NSString *)text;
|
|
|
|
|
|
- (void)kb_clearCurrentWord;
|
|
|
|
|
|
- (void)kb_scheduleContextRefreshResetSuppression:(BOOL)resetSuppression;
|
|
|
|
|
|
- (void)kb_refreshCurrentWordFromDocumentContextResetSuppression:
|
|
|
|
|
|
(BOOL)resetSuppression;
|
|
|
|
|
|
- (void)kb_updateSuggestionsForCurrentWord;
|
|
|
|
|
|
|
|
|
|
|
|
// Chat
|
|
|
|
|
|
- (void)kb_handleChatSendAction;
|
|
|
|
|
|
|
|
|
|
|
|
// Theme
|
|
|
|
|
|
- (void)kb_applyTheme;
|
|
|
|
|
|
- (void)kb_applyDefaultSkinIfNeeded;
|
|
|
|
|
|
- (void)kb_consumePendingShopSkin;
|
|
|
|
|
|
- (void)kb_registerDarwinSkinInstallObserver;
|
|
|
|
|
|
- (void)kb_unregisterDarwinSkinInstallObserver;
|
|
|
|
|
|
|
|
|
|
|
|
// Layout
|
|
|
|
|
|
- (CGFloat)kb_portraitWidth;
|
|
|
|
|
|
- (CGFloat)kb_keyboardHeightForWidth:(CGFloat)width;
|
|
|
|
|
|
- (CGFloat)kb_keyboardBaseHeightForWidth:(CGFloat)width;
|
|
|
|
|
|
- (CGFloat)kb_chatPanelHeightForWidth:(CGFloat)width;
|
|
|
|
|
|
- (void)kb_updateKeyboardLayoutIfNeeded;
|
|
|
|
|
|
|
|
|
|
|
|
@end
|