Ich habe den Vorgang mit Xcode12 und SwiftUI bestätigt.
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.
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.
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
}
}
}
}
}
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
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! ** ** **
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