繁体   English   中英

添加 UI 包装器时,我无法使用分隔符将文本视图推送到我的 swift ui VStack 视图的顶部

[英]I am unable to use a spacer to push a text view to the top of my swift ui VStack view, when adding UI wrappers

我在下面有一段代码,但问题是文本字段位于视图的中间,当我在下面添加间隔符以将文本字段推到视图顶部时,它不会将文本字段推到视图的顶部,而是它仅在我指定间隔器的 minLength 时移动,但我们知道这不是正确的方法,因为不同的手机具有不同的尺寸。 所以有人可以对此提供适当的修复或发现阻碍 spacer() 工作的原因

import SwiftUI

struct FocusedTextField: UIViewRepresentable {
    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: FocusedTextField

        init(_ parent: FocusedTextField) {
            self.parent = parent
        }

        func textFieldDidEndEditing(_ textField: UITextField) {
            parent.text = textField.text ?? ""
        }
    }

    @Binding var text: String
    @Binding var isFocused: Bool

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: UIViewRepresentableContext<FocusedTextField>) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.delegate = context.coordinator
        textField.textColor = .black
        textField.placeholder = "Enter some text"
        return textField
    }

    func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<FocusedTextField>) {
        uiView.text = text
        if isFocused && !uiView.isFirstResponder {
            uiView.becomeFirstResponder()
        }
    }
}

struct testList: View {
    @State private var text: String = ""
    @State private var isFocused: Bool = false

    var body: some View {
        VStack{
            
            FocusedTextField(text: $text, isFocused: $isFocused)
            
        }
        .onAppear {
            self.text = ""
            self.isFocused = true
        }
        .padding()
    }
}


struct textList_Previews: PreviewProvider {
    static var previews: some View {
        testList()
    }
}

问题出在FocusedTextField中。 如果您使用 SwiftUI 中的TextField本身,则可以使用Spacer()轻松地将其推VStack中。

struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        
        VStack{
            TextField("Enter some Text", text: $text)
            Spacer()
        }        
        .onAppear {
            self.text = ""
        }
        .padding()
    }
}

我强烈建议您查看@FocusState属性包装器以实现焦点 state。您可以在此处阅读更多相关信息: https://developer.apple.com/documentation/swiftui/focusstate

对于垂直换行,您需要在 makeUIView 中添加一些代码:

textField.setContentHuggingPriority(.required, for: .vertical)

并在 testList() 中添加spacer() )

试试下面的代码:

struct FocusedTextField: UIViewRepresentable {
    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: FocusedTextField
        
        init(_ parent: FocusedTextField) {
            self.parent = parent
        }
        
        func textFieldDidEndEditing(_ textField: UITextField) {
            parent.text = textField.text ?? ""
        }
    }
    
    @Binding var text: String
    @Binding var isFocused: Bool
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func makeUIView(context: UIViewRepresentableContext<FocusedTextField>) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.delegate = context.coordinator
        textField.textColor = .black
        textField.placeholder = "Enter some text"
        textField.setContentHuggingPriority(.required, for: .vertical)   //<---------------here
        return textField
    }
    
    func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<FocusedTextField>) {
        uiView.text = text
        if isFocused && !uiView.isFirstResponder {
            uiView.becomeFirstResponder()
        }
    }
}

struct testList: View {
    @State private var text: String = ""
    @State private var isFocused: Bool = false
    
    var body: some View {
        VStack{
            
            FocusedTextField(text: $text, isFocused: $isFocused)
            
            Spacer()    //<--------- here
                
            
        }
        .onAppear {
            self.text = ""
            self.isFocused = true
        }
        .padding()
    }
}


struct textList_Previews: PreviewProvider {
    static var previews: some View {
        testList()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM