首页 > 解决方案 > 如何延迟 SwiftUI 的 SecureField 中字符的模糊/屏蔽,以便每个键入的字符在隐藏之前显示约 1 秒?

问题描述

当使用 SwiftUI 的SecureField时,用户的输入会立即被隐藏/屏蔽/变成 •,这使得很难确认用户是否确实输入了正确的密码。我们的一些用户对此提出了抱怨,而且似乎大多数人希望看到他们输入的字符大约一秒钟左右就会消失,这让他们可以直观地确认他们点击了正确的字母并且现在可以继续o 令人担忧。

是否可以在其中添加延迟并暂时显示最后输入的字符?

标签: swiftui

解决方案


我认为目前在 SwiftUI 中这是不可能的,但这是我们在此期间一直在使用的 hack。它将 SecureField 堆叠在 TextField 之上,并在用户单击眼睛时切换其不透明度(以显示文本)。当然,它显示了整个字符串而不是最后一个字母,但它可以工作。

我确信在 UIKit 中有可以转换的开源方法库,但我会让其他人回答这个问题。

struct SecureTextFieldView: View {
        
    @State var text: String = ""
    @State var showText: Bool = false
    
    var body: some View {
        ZStack {
            TextField("Password", text: $text)
                .opacity(showText ? 1.0 : 0.0)
            SecureField("Password", text: $text)
                .opacity(showText ? 0.0 : 1.0)
        }
        .padding()
        .background(
            Color(UIColor.secondarySystemBackground).cornerRadius(10)
        )
        .overlay(
            Image(systemName: "eye.fill")
                .foregroundColor(showText ? .black : .gray)
                .padding(.trailing)
                .onLongPressGesture(minimumDuration: 20, maximumDistance: 30, pressing: { (_) in
                    showText.toggle()
                }, perform: {})
            
            , alignment: .trailing
        )
        .padding()
    }
}

struct SecureTextFieldView_Previews: PreviewProvider {
    static var previews: some View {
        SecureTextFieldView()
    }
}

推荐阅读