ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

如何做一个跟随键盘丝滑移动的聊天输入框?UIViewController-KeyboardAnimation 配合 Auto Layout 实战

2026/8/27 14:24:48 拓冰建站 浏览量
如何做一个跟随键盘丝滑移动的聊天输入框?UIViewController-KeyboardAnimation 配合 Auto Layout 实战 如何做一个跟随键盘丝滑移动的聊天输入框UIViewController-KeyboardAnimation 配合 Auto Layout 实战【免费下载链接】UIViewController-KeyboardAnimationShowing/dismissing keyboard animation in UIViewController category.项目地址: https://gitcode.com/gh_mirrors/ui/UIViewController-KeyboardAnimationUIViewController-KeyboardAnimation 是一个轻量的 iOS 键盘动画分类Category它帮你在键盘弹出/收起的瞬间用系统一致的时长与曲线同步执行自定义动画几行代码就能实现「聊天输入框跟随键盘丝滑移动」的效果。本文带你从零理解它的原理并用 Auto Layout 实战搭出一个跟随键盘的输入框。痛点为什么键盘动画总写不对做过聊天 App 的同学都有体会键盘一弹出来输入框不是被挡住就是生硬地跳上去。自己监听UIKeyboardWillShowNotification时要手动从userInfo里取键盘高度、动画时长和曲线再包一层UIView动画——代码又长又容易漏动画时长/曲线没对齐输入框移动和键盘「不同步」看着就卡忘记解绑通知页面跳转后旧控制器还在响应键盘事件block 里直接捕获self形成循环引用导致内存泄漏。UIViewController-KeyboardAnimation 把这些「脏活」全部封装进了一个 UIViewController 分类里。项目速览4 个 API 搞定键盘动画整个库只有两个核心文件头文件UIViewControllerKeyboardAnimation.hAPI 声明与说明实现文件UIViewControllerKeyboardAnimation.m通知监听与动画封装对外提供 4 组关键 API覆盖了聊天页常见的全部需求API作用an_subscribeKeyboardWithAnimations:completion:订阅键盘弹出/收起执行主动画最常用an_subscribeKeyboardWithBeforeAnimations:animations:completion:多一个「动画开始前」回调适合做过渡效果an_subscribeKeyboardFrameChangesWithAnimations:响应键盘尺寸变化如横竖屏切换、输入法切换1.3 版本新增an_unsubscribeKeyboard解绑事件并清空 block防止串场每个动画 block 都会收到三个参数keyboardRect键盘最终 frame、duration动画时长、isShowing弹出还是收起。你只需要在自己的动画里改约束、调布局同步问题交给分类处理。原理揭秘系统通知 关联对象实现文件UIViewControllerKeyboardAnimation.m的核心逻辑非常透明注册通知订阅时向 NotificationCenter 注册UIKeyboardWillShowNotification/UIKeyboardWillHideNotification尺寸变化则注册UIKeyboardWillChangeFrameNotification解析通知从userInfo中提取键盘 frameUIKeyboardFrameEndUserInfoKey、曲线和时长执行动画用系统给的时长和曲线调用UIView animateWithDuration你的 block 在动画闭包内执行天然和键盘动画同步持有 block用 ObjC 运行时关联对象associated object把 block 挂在当前视图控制器上因此调用时要用weakify / strongify避免循环引用——头文件里也明确写了这条警告。想深入细节可以直接阅读 实现源码通知处理集中在an_keyboardWillShowHide:isShowing:方法中。实战3 步接入聊天输入框Auto Layout 版这是官方 README 推荐的经典做法也是最适合新手的路径。第 1 步安装依赖pod UIViewControllerKeyboardAnimation, ~ 1.3也可以直接克隆仓库后把*.{h,m}文件拷进工程git clone https://gitcode.com/gh_mirrors/ui/UIViewController-KeyboardAnimation第 2 步在 Interface Builder 里搭约束给输入框底部和 superview 底部之间创建一条 Auto Layout 约束Bottom Space并通过 IBOutlet 暴露给代码property (weak, nonatomic) IBOutlet NSLayoutConstraint *chatInputBottomSpace;第 3 步订阅键盘事件viewWillAppear是订阅的最佳位置viewWillDisappear是解绑的最佳位置// viewWillAppear 中订阅 [weakify(self)]; [self an_subscribeKeyboardWithAnimations:^(CGRect keyboardRect, NSTimeInterval duration, BOOL isShowing) { [strongify(self)]; self.chatInputBottomSpace.constant isShowing ? CGRectGetHeight(keyboardRect) : 0; [self.view layoutIfNeeded]; } completion:nil]; // viewWillDisappear 中解绑 [self an_unsubscribeKeyboard];就这么短。注意动画 block 内一定要调用layoutIfNeeded这是让约束变化参与当前动画帧的关键——分类只是提供了「舞台」布局刷新仍需你触发。进阶技巧让输入框体验更上一层楼用 before 回调做平滑过渡需要「先淡出、再上滑」这类复合效果时改用带 beforeAnimations 的 APIbefore block 在动画开始前执行适合设置标志位或启动过渡动画main block 负责改约束completion 在动画结束后回调可用来复位标志位。处理键盘尺寸动态变化横屏旋转、切换表情面板等场景下键盘高度会变但不会触发 show/hide。1.3 版本起可用an_subscribeKeyboardFrameChangesWithAnimations:监听UIKeyboardWillChangeFrameNotification并用an_unsubscribeKeyboardFrameChanges解绑。别忘了弱引用头文件中的警告原文block 会被视图控制器持有和所有 block 风格 API 一样请避免循环引用。养成weakify / strongifyReactiveCocoa或__weak/__strong的习惯即可彻底规避内存泄漏。上手 Demo跟着示例快速验证工程自带完整示例位于Demo/KeyboardAnimationDemo/目录核心逻辑在Demo/KeyboardAnimationDemo/ViewController.m的subscribeToKeyboard方法中它同时驱动了底部条上移tabBarBottomSpace约束和按钮位移动画buttonBottomSpace约束并切换背景色是观察「多约束同步动画」的好样本。布局则定义在Demo/KeyboardAnimationDemo/Base.lproj/Main.storyboard可以直接对照本文第 2 步的约束思路。小结一个分类、两个文件零侵入地接管 iOS 键盘动画的时序与曲线配合 Auto Layout 约束 layoutIfNeeded输入框即可与键盘同帧移动、丝滑跟手viewWillAppear订阅、viewWillDisappear解绑弱引用写 block三条纪律守住稳定性。如果你正在做聊天、评论或搜索页的键盘适配这套「分类 约束」的组合是成本极低、效果最稳的方案值得直接放进你的工具链。【免费下载链接】UIViewController-KeyboardAnimationShowing/dismissing keyboard animation in UIViewController category.项目地址: https://gitcode.com/gh_mirrors/ui/UIViewController-KeyboardAnimation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考