You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中OTP输入框粘贴文本时下划线从左到右逐次动画实现方案

解决方案

问题原因

你当前粘贴逻辑是直接把处理好的完整OTP字符串一次性赋值给otpField,所有输入位的beforeCursor状态会同时变为true,所以所有下划线的动画同步触发。

修复思路

修改粘贴方法,将处理后的OTP字符串逐位追加到otpField中,每追加一位增加100ms左右的延迟(可自行调整时长匹配手动输入的动画节奏),模拟手动逐位输入的状态变更节奏,即可实现从左到右逐个播放动画的效果。该方案使用GCD实现延迟,完全兼容iOS13+以及Xcode12.3的开发环境,不需要引入高版本API。

代码修改

仅需要替换原有的pasteText方法即可,修改后的代码如下:

func pasteText() {
    let pasteboard = UIPasteboard.general
    guard let pastedString = pasteboard.string else {
        return
    }
    let decimalInputOnly = pastedString
        .components(separatedBy:CharacterSet.decimalDigits.inverted)
        .joined()
    let otpToPaste = Array(decimalInputOnly.prefix(viewModel.numberOfFields))
    
    // 如果需要粘贴时覆盖原有输入,打开下面一行注释即可
    // viewModel.otpField = ""
    
    let startIndex = viewModel.otpField.count
    for (index, char) in otpToPaste.enumerated() {
        let delay = Double(index) * 0.1 // 每100ms追加一位,可调整时长
        DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
            // 防止超出最大位数
            guard viewModel.otpField.count < viewModel.numberOfFields else { return }
            viewModel.otpField.append(char)
        }
    }
}

如果需要调整动画的播放速度,只需要修改0.1这个数值即可,数值越小动画播放越快,数值越大越慢。

内容的提问来源于stack exchange,提问作者Dreiohc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:30:05