[SWIFT] Ab iOS 14 wird das auf der Tastatur ausgeblendete Textfeld automatisch angepasst.

Einführung

Ich habe den Vorgang mit Xcode12 und SwiftUI bestätigt.

iOS 14 Textfeld

Bei der herkömmlichen Anwendungsentwicklung tritt das folgende Verhalten häufig auf Bildschirmen mit Tastatureingabe auf, und es war üblich, beispielsweise das Anpassen der Anzeigeposition an die Höhe der Tastatur zu implementieren.

  1. TextField ist im Fokus
  2. Die Software-Tastatur wird angezeigt
  3. TextField verschwindet, weil die Tastatur angezeigt wird
struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        VStack {
            Spacer()
            TextField("input here", text: $text)
                .padding()
        }
    }
}

In Reaktion auf diese Situation passt iOS 14 die Anzeige automatisch so an, dass das von Ihnen eingegebene TextField außerhalb des Anzeigebereichs der Tastatur angezeigt wird.

Dies ist eine sehr nützliche Änderung, aber es gibt einige Dinge zu beachten.

wichtiger Punkt

Da dieses automatische Anpassungsverhalten nur in iOS14 ausgeführt wird, ist es erforderlich, die Implementierung der Anzeigeanpassung in iOS13 wie zuvor selbst zu implementieren.

struct ContentView: View {
    @State private var text: String = ""
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            Spacer()
            TextField("input here", text: $text)
                .padding()
                .padding(.bottom, viewModel.bottomPadding)
        }
    }
}

class ViewModel: ObservableObject {
    @Published var bottomPadding: CGFloat = 0.0
    
    init() {
        NotificationCenter.default.addObserver(
            forName: UIResponder.keyboardWillChangeFrameNotification,
            object: nil,
            queue: OperationQueue.main
        ) { [weak self](notification: Notification) -> Void in
            guard let userInfo = notification.userInfo,
                  let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
            withAnimation {
                self?.bottomPadding = keyboardFrame.size.height
            }
        }
    }
}

Wenn Sie jedoch den Unterschied im Verhalten zwischen Betriebssystemen hier nicht kennen, wird das TextField an eine Position verschoben, die in iOS 14 nicht erwartet wird (siehe unten).

Wenn iOS 13 oder niedriger unterstützt wird, scheint es daher erforderlich zu sein, das Verhalten für jedes Betriebssystem zu ändern.

class ViewModel: ObservableObject {
    @Published var bottomPadding: CGFloat = 0.0

    init() {
        if #available(iOS 14, *) {
        } else {
            NotificationCenter.default.addObserver(
                forName: UIResponder.keyboardWillChangeFrameNotification,
                object: nil,
                queue: OperationQueue.main
            ) { [weak self](notification: Notification) -> Void in
                guard let userInfo = notification.userInfo,
                      let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
                withAnimation {
                    self?.bottomPadding = keyboardFrame.size.height
                }
            }
        }
    }
}

Unterschied im Verhalten

Abschließend werde ich zusammenfassen, welche Art von Verhalten je nach Bildschirmkonfiguration unterschiedlich ist.

List

struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        List {
            ForEach(0..<30) {
                Text("\($0)")
            }
            TextField("input here", text: $text)
                .padding()
        }
    }
}

ScrollView

struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        ScrollView {
            ForEach(0..<30) {
                Text("\($0)")
            }
            TextField("input here", text: $text)
                .padding()
        }
    }
}

VStack

Wenn Sie nicht genug Platz haben

struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        VStack {
            ForEach(0..<30) {
                Text("\($0)")
            }
            TextField("input here", text: $text)
                .padding()
        }
    }
}

: Warnung: ** Beachten Sie, dass es nicht angezeigt wird! ** ** **

Wenn genügend Platz vorhanden ist

struct ContentView: View {
    @State private var text: String = ""
    
    var body: some View {
        VStack {
            ForEach(0..<20) {
                Text("\($0)")
            }
            TextField("input here", text: $text)
                .padding()
        }
    }
}

Recommended Posts

Ab iOS 14 wird das auf der Tastatur ausgeblendete Textfeld automatisch angepasst.
So lösen Sie das Problem, dass unter iOS14 keine Benachrichtigung angefordert werden kann
So passen Sie TextPosition mit der iOS-Tastaturerweiterung an
[Swift 5] Verarbeitung zum Schließen der Tastatur in UITableView