es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mueva TextEditor (en la lista) hacia arriba cuando aparezca el teclado en SwiftUI.

Tengo un List de SwiftUI con un TextEditor como la última fila. En SwiftUI, los campos de texto se mueven automáticamente hacia arriba por encima del teclado. Pero desafortunadamente, cuando el TextEditor está en un List, parece que no funciona.

Ha habido muchas soluciones buenas para esto al usar un TextField Ejemplo:- https://stackoverflow.com/questions/56491881/move-textfield-up-when-the-keyboard-has-appeared-in-swiftui/60178361#60178361. Pero ninguna de ellas parece funcionar cuando se usa un TextEditor.


struct ContentView: View { @State var items: [String] = ["Manzanas", "Naranjas", "Plátanos", "Peras", "Mangos", "Pomelos","Manzanas", "Naranjas", "Plátanos", "Peras", "Mangos", "Pomelos"] @State private var newItemText : String = "" var body: some View { ZStack(alignment: Alignment.bottom) { List{ ForEach(items, id: \.self) { Text("\($0)") } TextEditor(text: $newItemText) } } } }
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no existe una forma incorporada de mover el TextEditor hacia arriba cuando aparece el teclado en SwiftUI. Sin embargo, existe una solución alternativa que se puede utilizar para lograr esto.

    La solución alternativa implica agregar un GeometryReader a la List y luego utilizar el modificador onAppear para ajustar el offset de la List cuando aparece el teclado.

    Aquí hay un ejemplo de cómo se puede hacer esto:

    struct ContentView: View {
    
        @State var items: [String] = ["Manzanas", "Naranjas", "Plátanos", "Peras", "Mangos", "Toronjas","Manzanas", "Naranjas", "Plátanos", "Peras", "Mangos", "Toronjas"]
    
        @State private var newItemText: String = ""
        @State private var offset: CGFloat = 0
    
        var body: some View {
            ZStack(alignment: Alignment.bottom) {
                GeometryReader { geometry in
                    List {
                        ForEach(items, id: \.self) {
                            Text("\($0)")
                        }
                        TextEditor(text: $newItemText)
                    }
                    .offset(y: self.offset)
                    .onAppear {
                        NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { (notification) in
                            let value = notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! CGRect
                            let height = value.height
                            let bottomSpace = geometry.frame(in: .global).maxY - geometry.frame(in: .global).minY
                            self.offset = height - bottomSpace
                        }
    
                        NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { (notification) in
                            self.offset = 0
                        }
                    }
                }
            }
        }
    }
    

Comments are closed.