清理键盘emoji内存高的问题

This commit is contained in:
2026-03-04 15:06:49 +08:00
parent fd5de4f197
commit 5c0cf2b435
6 changed files with 158 additions and 22 deletions

View File

@@ -30,6 +30,9 @@ NS_ASSUME_NONNULL_BEGIN
/// 高亮指定分类
- (void)selectCategoryAtIndex:(NSInteger)index;
/// 释放 emoji 数据缓存(隐藏面板时可用)
- (void)purgeEmojiCache;
@end
NS_ASSUME_NONNULL_END

View File

@@ -185,6 +185,15 @@
[self updateSelectionToIndex:preserved];
}
- (void)purgeEmojiCache {
[self.dataProvider purgeLargeCaches];
self.categories = @[];
self.currentIndex = NSNotFound;
self.titleLabel.text = @"";
[self rebuildTabButtons];
[self.collectionView reloadData];
}
- (void)rebuildTabButtons {
UIStackView *stackView = self.bottomBar.tabStackView;
if (!stackView) { return; }

View File

@@ -66,14 +66,7 @@
make.bottom.equalTo(self.mas_bottom).offset(-bottomInset);
}];
self.emojiView = [[KBEmojiPanelView alloc] init];
self.emojiView.hidden = YES;
self.emojiView.alpha = 0.0;
self.emojiView.delegate = self;
[self addSubview:self.emojiView];
[self.emojiView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
// emoji
// [self.topBar mas_makeConstraints:^(MASConstraintMaker *make) {
// make.left.right.equalTo(self);
@@ -116,9 +109,10 @@
if (self.emojiPanelVisible == visible) return;
self.emojiPanelVisible = visible;
if (visible) {
[self.emojiView reloadData];
self.emojiView.hidden = NO;
[self bringSubviewToFront:self.emojiView];
KBEmojiPanelView *emojiView = [self emojiView];
[emojiView reloadData];
emojiView.hidden = NO;
[self bringSubviewToFront:emojiView];
} else {
self.keyboardView.hidden = NO;
self.topBar.hidden = NO;
@@ -126,19 +120,28 @@
}
void (^changes)(void) = ^{
self.emojiView.alpha = visible ? 1.0 : 0.0;
if (self.emojiView) {
self.emojiView.alpha = visible ? 1.0 : 0.0;
}
self.keyboardView.alpha = visible ? 0.0 : 1.0;
self.topBar.alpha = visible ? 0.0 : 1.0;
self.suggestionBar.alpha = visible ? 0.0 : ([self kb_shouldShowSuggestions] ? 1.0 : 0.0);
};
void (^completion)(BOOL) = ^(BOOL finished) {
self.emojiView.hidden = !visible;
if (self.emojiView) {
self.emojiView.hidden = !visible;
}
self.keyboardView.hidden = visible;
self.topBar.hidden = visible;
if (visible) {
self.suggestionBar.hidden = YES;
} else {
self.suggestionBar.hidden = ![self kb_shouldShowSuggestions];
if (self.emojiView) {
[self.emojiView purgeEmojiCache];
[self.emojiView removeFromSuperview];
self.emojiView = nil;
}
}
};
@@ -154,6 +157,22 @@
[self setEmojiPanelVisible:!self.emojiPanelVisible animated:YES];
}
#pragma mark - Lazy Load
- (KBEmojiPanelView *)emojiView {
if (!_emojiView) {
_emojiView = [[KBEmojiPanelView alloc] init];
_emojiView.hidden = YES;
_emojiView.alpha = 0.0;
_emojiView.delegate = self;
[self addSubview:_emojiView];
[_emojiView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
}
return _emojiView;
}
#pragma mark - KBToolBarDelegate