SuperAPI AI 工具集

swiftui-sheet-keyboard-animations

编程与开发

查看项目

更新于 10-15 22:15

技能介绍

用途:当 SwiftUI 的 sheet 需要在打开时键盘同步升起(自动聚焦 TextField/输入框),且动画不能出现错位(sheet 先落定、键盘再弹起导致输入栏上下跳)时使用本技能。资料定位为“纯 SwiftUI 风格”中实现 sheet 与键盘的编舞式协同呈现与同步关闭。

资料指出的失败做法:在 300–500ms 延迟后再设 draftFocused = true 虽可行但明显错位,sheet 先落定、键盘再弹出并再次抬起输入栏,形成上下弹跳;在 .task/.onAppear 中立即设 draftFocused = true 不行,@FocusState 无法与呈现过程共同动画,且绑定时字段可能尚未挂载,导致聚焦静默失败、键盘完全不出现;在 .medium detent 的 sheet 上做任何自动聚焦,键盘会把 medium sheet 顶到全高(Apple 论坛 #743274),输入栏会走过 sheet 距离加键盘高度的“大行程”再回落;在尝试交接时注销预热字段,若焦点尚未落定,卸载预热会先辞去第一响应者,键盘在呈现途中掉落。

推荐模式含四个缺一不可的部分:一、UIKit 预热字段,一个近乎不可见的 UITextField 在 didMoveToWindow 中调用 becomeFirstResponder(),UIKit 能在呈现转场期间取得键盘,使键盘随 sheet 一同升起(模式来源:github.com/naan/FocusOnAppear)。二、落定后交接,sheet 内容挂载约 400ms(此值资料称为安全)后设置真实字段的 @FocusState,此时键盘已可见所以等待不可见,并仅在焦点真正落定(onChange(of: focused))时才注销预热,绝不在尝试时就注销。三、以 .large 打开,不要在 .medium detent 上自动聚焦;若 sheet 有 detent 选择绑定,下次打开前重置为 .large。四、从第一帧冻结底部附属元素,任何在焦点落定时会折叠的内容(表情条、建议行)必须在自动打开期间从第一帧就呈折叠状态,否则其高度变化会在升起中途再加入一次跳动。

退出对称:显式关闭控件在同一事务内清除焦点并关闭(focused = false; onClose());sheet 拖拽关闭已原生带着键盘一起走。完整可改实现(预热 representable、状态接线、交接任务、附属元素门控,取自已发布 App)见 references/implementation.md。

危险信号:设 focused = true 前只有裸 Task.sleep 而无预热,就会出现那段空档;在同一语句中把 autoFocusPending 设为 false(或卸载预热)并尝试聚焦,键盘会在尝试与挂载竞争时掉落;自动聚焦的 sheet 使用 presentationDetents([.medium, .large]) 却未在打开时强制 .large,会过冲。

分类说明:该技能属于编程与开发范畴的 SwiftUI/UI 动画具体技巧;资料未提供收费、价格、平台支持范围等额外信息,暂未提供。