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

SwiftUI:如何为TextField实现持续显示的删除线效果?

SwiftUI TextField 实现持续删除线效果

直接给TextField添加.strikethrough()修饰符无效,因为系统默认的TextField控件会忽略这个文本样式修饰符。以下是两种纯SwiftUI实现方案:

方案一:ZStack叠加文本实现(纯SwiftUI)

通过将透明的TextField和带删除线的Text叠加,让Text显示删除线效果,TextField负责处理输入交互:

@State var textFieldText: String = ""

var body: some View {
    ZStack(alignment: .leading) {
        // 透明TextField负责接收输入
        TextField("", text: $textFieldText)
            .opacity(0)
            .padding(.leading, 8)
        
        // 带删除线的Text同步展示输入内容
        Text(textFieldText)
            .strikethrough()
            .padding(.leading, 8)
            .allowsHitTesting(false) // 允许点击穿透到下方TextField
    }
    // 添加占位提示文本
    .overlay(
        Text("some_prompt")
            .foregroundColor(.secondary)
            .opacity(textFieldText.isEmpty ? 1 : 0)
            .padding(.leading, 8)
    )
    .padding()
}

方案二:AttributedString结合叠加层(iOS 16+)

利用AttributedString设置删除线样式,通过叠加层同步显示输入内容:

@State var textFieldText: String = ""

var body: some View {
    TextField("some_prompt", text: $textFieldText)
        .font(.body)
        .overlay(
            Text(AttributedString(textFieldText).strikethrough())
                .padding(.leading, 8)
                .allowsHitTesting(false)
                .opacity(textFieldText.isEmpty ? 0 : 1)
        )
        .padding()
}

内容的提问来源于stack exchange,提问作者Vêx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:56:16