SuperAPI AI 工具集

swiftui-sheet-keyboard-choreography

前端与建站

查看项目

更新于 10-15 22:15

技能介绍

用途:解决 SwiftUI 中 sheet 打开时键盘应同步升起(自动聚焦 TextField/输入框)的动画编排问题,让 sheet 与键盘作为一个动作出现、一起消失,接近纯 SwiftUI 实现。

主要能力:说明朴素做法为何失败,并给出四件套模式。1)UIKit 预热输入框:一个近乎不可见的 UITextField,在 didMoveToWindow 中调用 becomeFirstResponder(),使键盘能在呈现过渡期间随 sheet 升起。2)落地门控交接:sheet 内容挂载后(约 400ms 安全,此时键盘已可见,等待不可察觉)再设置真实输入框的 @FocusState;仅在焦点真正落地(onChange(of: focused))时移除预热,绝不在尝试时移除。3)以 .large 打开:不要在 .medium detent 上自动聚焦;若有 detent 选择绑定,下次打开前重置为 .large。4)从第一帧冻结底部附件:任何在焦点落地时会折叠的元素(表情条、建议行)必须在自动打开期间从第一帧就渲染为折叠态,否则其高度变化会在升起过程中造成额外跳动。退出对称:显式关闭控件在同一事务中清除焦点并关闭(focused = false; onClose());sheet 拖拽关闭本身会原生带动键盘。

使用方式:完整可适配实现见 references/implementation.md,包含预热 representable、状态接线、交接任务与附件门控,提取自已上线应用。

适用场景:SwiftUI sheet 中带自动聚焦输入框或撰写框、需要键盘与 sheet 同步动画的界面。

限制与警示:裸 Task.sleep 后再 focused = true 且无预热,会出现间隙;在焦点尝试的同一条语句中把 autoFocusPending 置 false 或卸载预热,会在尝试与挂载竞争时导致键盘掉落;自动聚焦 sheet 使用 presentationDetents([.medium, .large]) 而未在打开时强制 .large,会过度上冲。