修改动画
This commit is contained in:
@@ -110,8 +110,8 @@
|
||||
#pragma mark - 1:控件初始化
|
||||
|
||||
- (void)setupUI {
|
||||
self.voiceInputBarHeight = 150.0;
|
||||
self.baseInputBarBottomSpacing = 20.0;
|
||||
self.voiceInputBarHeight = 120.0;
|
||||
self.baseInputBarBottomSpacing = KB_TABBAR_HEIGHT;
|
||||
[self.view addSubview:self.collectionView];
|
||||
[self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.edges.equalTo(self.view);
|
||||
@@ -350,12 +350,30 @@
|
||||
NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
|
||||
UIViewAnimationOptions options = ([userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue] << 16);
|
||||
|
||||
// 将键盘的 frame 转换到当前 view 的坐标系
|
||||
CGRect convertedFrame = [self.view convertRect:endFrame fromView:nil];
|
||||
CGFloat keyboardHeight = MAX(0.0, CGRectGetMaxY(self.view.bounds) - CGRectGetMinY(convertedFrame));
|
||||
self.currentKeyboardHeight = keyboardHeight;
|
||||
|
||||
CGFloat bottomSpacing = (keyboardHeight > 0.0) ? (keyboardHeight + 8.0) : self.baseInputBarBottomSpacing;
|
||||
NSLog(@"[KBAIHomeVC] 键盘高度: %.2f, 屏幕高度: %.2f, 键盘 Y: %.2f",
|
||||
keyboardHeight, CGRectGetMaxY(self.view.bounds), CGRectGetMinY(convertedFrame));
|
||||
|
||||
// 问题1修复:计算 VoiceInputBar 应该距离 view.bottom 多远
|
||||
CGFloat bottomSpacing;
|
||||
if (keyboardHeight > 0.0) {
|
||||
// 键盘弹起时:让 VoiceInputBar 紧贴键盘上方(距离 5px)
|
||||
// bottomSpacing = 键盘高度 - 5px(因为是负的 offset)
|
||||
bottomSpacing = keyboardHeight - 5.0;
|
||||
} else {
|
||||
// 键盘隐藏时:恢复到原始位置
|
||||
bottomSpacing = self.baseInputBarBottomSpacing;
|
||||
}
|
||||
|
||||
NSLog(@"[KBAIHomeVC] VoiceInputBar bottomSpacing: %.2f", bottomSpacing);
|
||||
|
||||
[self.voiceInputBarBottomConstraint setOffset:-bottomSpacing];
|
||||
|
||||
// 问题2修复:键盘弹起时更新 ChatView 的 bottomInset
|
||||
[self updateChatViewBottomInset];
|
||||
|
||||
[UIView animateWithDuration:duration
|
||||
@@ -433,13 +451,49 @@
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)updateChatViewBottomInset {
|
||||
CGFloat bottomSpacing = (self.currentKeyboardHeight > 0.0) ? (self.currentKeyboardHeight + 8.0) : self.baseInputBarBottomSpacing;
|
||||
// 问题2修复:键盘弹起时,增加 bottomInset 让最后一条消息显示在 VoiceInputBar 上方
|
||||
CGFloat bottomInset;
|
||||
|
||||
// 关键修复:减少 bottomInset,因为 chatView 已经通过约束避开了底部的 avatar 区域
|
||||
// 只需要留出一点空间(比如20)让最后一条消息不紧贴 chatView 底部即可
|
||||
CGFloat bottomInset = 20; // 简单的缓冲空间
|
||||
if (self.currentKeyboardHeight > 0.0) {
|
||||
// 键盘弹起时:
|
||||
// avatarImageView 距离屏幕底部的距离 = KB_TABBAR_HEIGHT + 50 + 20
|
||||
// chatView 物理底部到屏幕底部 = KB_TABBAR_HEIGHT + 50 + 20 + 54(头像) + 10(间距) ≈ 153
|
||||
// 但是 VoiceInputBar 和键盘会遮挡 chatView
|
||||
// 需要的 bottomInset = 键盘高度 + VoiceInputBar 高度 - chatView 已经避开的底部区域
|
||||
|
||||
CGFloat avatarBottomSpace = KB_TABBAR_HEIGHT + 50 + 20; // avatarImageView 距离底部的距离
|
||||
CGFloat chatViewPhysicalBottomSpace = avatarBottomSpace + 54 + 10; // chatView 物理底部距离屏幕底部
|
||||
|
||||
// 需要抬高的额外距离 = (键盘 + InputBar) - chatView 已经避开的空间
|
||||
bottomInset = (self.currentKeyboardHeight + self.voiceInputBarHeight) - chatViewPhysicalBottomSpace;
|
||||
|
||||
// 确保不会是负数
|
||||
bottomInset = MAX(bottomInset, 20);
|
||||
|
||||
NSLog(@"[KBAIHomeVC] 键盘弹起 - bottomInset: %.2f (键盘: %.2f + InputBar: %.2f - 已避开: %.2f)",
|
||||
bottomInset, self.currentKeyboardHeight, self.voiceInputBarHeight, chatViewPhysicalBottomSpace);
|
||||
} else {
|
||||
// 键盘隐藏时:恢复原来的 bottomInset
|
||||
bottomInset = 20; // 简单的缓冲空间
|
||||
NSLog(@"[KBAIHomeVC] 键盘隐藏 - bottomInset: %.2f", bottomInset);
|
||||
}
|
||||
|
||||
NSLog(@"[KBAIHomeVC] 更新 ChatView bottomInset: %.2f", bottomInset);
|
||||
for (NSIndexPath *indexPath in self.collectionView.indexPathsForVisibleItems) {
|
||||
KBPersonaChatCell *cell = (KBPersonaChatCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
|
||||
if (cell) {
|
||||
[cell updateChatViewBottomInset:bottomInset];
|
||||
|
||||
// 键盘弹起时,自动滚动到最后一条消息
|
||||
if (self.currentKeyboardHeight > 0.0) {
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[cell.chatView scrollToBottom]; // 修复:使用无参数的方法
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NSLog(@"[KBAIHomeVC] 更新 ChatView bottomInset: %.2f (键盘高度: %.2f)", bottomInset, self.currentKeyboardHeight);
|
||||
|
||||
for (NSIndexPath *indexPath in self.collectionView.indexPathsForVisibleItems) {
|
||||
KBPersonaChatCell *cell = (KBPersonaChatCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
|
||||
|
||||
Reference in New Issue
Block a user