swift - 删除 TextEditor 上的填充

标签 swift swiftui

我下面的自定义文本编辑器,一旦您单击笔进行编辑,就会出现一个新空格,因此之前的文本与新文本不在同一行。我怎样才能解决这个问题?这是一个简单的可重现示例:

struct SwiftUIView: View {
    
    @State var name: String = "test"
    @State var showEdit: Bool = true
    
    var body: some View {
        HStack {
            HStack {
                if(showEdit) {
                    CustomTextEditor.init(placeholder: "My unique name", text: $name)
                        .font(.headline)
                } else {
                    Text(name)
                        .font(.headline)
                }
            }
            
            Spacer()
            
            Button(action: {
                showEdit.toggle()
            }) {
                Image(systemName: "pencil")
                    .foregroundColor(.secondary)
            }
        }
    }
}

struct CustomTextEditor: View {
    let placeholder: String
    
    @Binding var text: String
    
    var body: some View {
        ZStack {
            if text.isEmpty  {
                Text(placeholder)
                    .foregroundColor(Color.primary.opacity(0.25))
            }
            TextEditor(text: $text)
        }.onAppear() {
            UITextView.appearance().backgroundColor = .clear
        }.onDisappear() {
            UITextView.appearance().backgroundColor = nil
        }
    }
}

我希望它具有与插入简单的 Text("") 相同的填充属性,所以当我在 Text("xyz") 之间切换时TextEditor(text: $xyz) 它具有相同的填充对齐方式。现在 TextEditor 有一个奇怪的填充。

最佳答案

尝试将 TextTextEditor(或 TextField,就此而言)对齐,您会发疯的,所以不要试试看使用另一个禁用的 TextEditor,并根据绑定(bind)变量是否为空来控制顶部的 .opacity()。像这样:

struct CustomTextEditor: View {
    
    @Binding var text: String
    @State private var placeholder: String

    init(placeholder: String, text: Binding<String>) {
        _text = text
        _placeholder = State(initialValue: placeholder)
    }
    
    var body: some View {
        ZStack {
            TextEditor(text: $placeholder)
                .disabled(true)
            TextEditor(text: $text)
                .opacity(text == "" ? 0.7 : 1)
        }
    }
}

如果没有文本,此 View 将显示占位符,并在有文本时立即隐藏占位符。

编辑:

您不需要其他 View 中的按钮等。它变得简单:

struct SwiftUIView: View {
    @State var name: String = ""
    
    var body: some View {
        CustomTextEditor.init(placeholder: "My unique name", text: $name)
            .font(.headline)
            .padding()
    }
}

如果您需要键盘上的“完成”按钮,请将您的 CustomTextEditor() 更改为:

struct CustomTextEditor: View {
    
    @Binding var text: String
    @State private var placeholder: String

    @FocusState var isFocused: Bool
    
    init(placeholder: String, text: Binding<String>) {
        _text = text
        _placeholder = State(initialValue: placeholder)
    }
    
    var body: some View {
        ZStack {
            TextEditor(text: $placeholder)
                .disabled(true)
            TextEditor(text: $text)
                .opacity(text == "" ? 0.7 : 1)
                .focused($isFocused)
        }
        .toolbar {
            ToolbarItemGroup(placement: .keyboard) {
                Button {
                    isFocused = false
                } label: {
                    Text("Done")
                        .foregroundColor(.accentColor)
                        .padding(.trailing)
                }
            }
        }
    }
}

关于swift - 删除 TextEditor 上的填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71259342/

相关文章:

Swift 闭包符合类型别名,包括 Any

ios - 这些闭包中的保留周期有什么区别?标准闭包与对象初始化闭包

ios - 如何将 SwiftUI View 作为函数参数传递?

facebook - SwiftUI Facebook SDK : App ID not found. 将带有您的应用程序 ID 的字符串值添加到 Info.plist

swift - 如何在行 Collection View 中创建 2 个单元格

arrays - Swift:如何将一个字符串数组拆分为多个匹配值的数组?

Swift UI - 如何制作图像网格?

swiftui - @Published 属性不从嵌套 View 模型更新 View - SwiftUI

ios - View Controller 的 Swift 方向覆盖

swiftui - 在 SwiftUI 中更改默认系统字体