Ich versuche, einen Eingabebildschirm für das iPhone zu erstellen. Der Bildschirm verfügt über eine Reihe von Eingabefeldern. Die meisten davon befinden sich oben auf dem Bildschirm, aber zwei Felder befinden sich unten. Wenn der Benutzer versucht, den Text am unteren Bildschirmrand zu bearbeiten, wird die Tastatur eingeblendet und der Bildschirm abgedeckt. Ich habe eine einfache Lösung gefunden, um den Bildschirm nach oben zu verschieben, aber das Ergebnis ist, dass der Bildschirm immer nach oben bewegt wird und die Felder oben auf dem Bildschirm außer Reichweite sind, wenn der Benutzer versucht, diese zu bearbeiten.
Gibt es eine Möglichkeit, den Bildschirm nur zu verschieben, wenn die unteren Felder bearbeitet werden?
Ich habe diesen Code verwendet, den ich hier gefunden habe :
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Antworten:
Ihr Problem wird in diesem Dokument von Apple ausführlich erläutert . Der Beispielcode auf dieser Seite (at
Listing 4-1
) macht genau das, was Sie brauchen. Er scrollt nur dann durch Ihre Ansicht, wenn sich die aktuelle Bearbeitung unter der Tastatur befinden soll. Sie müssen nur die erforderlichen Steuerelemente in eine scrollViiew einfügen. Das einzige Problem ist, dass dies Objective-C ist und ich denke, Sie brauchen es in Swift ... also ... hier ist es:Deklarieren Sie eine Variable
Fügen Sie dann diese Methoden hinzu
Stellen Sie sicher, dass Sie Ihren ViewController als deklarieren
UITextFieldDelegate
und in Ihren Initialisierungsmethoden die richtigen Delegaten festlegen : Beispiel:Und denken Sie daran,
registerForKeyboardNotifications
viewInit undderegisterFromKeyboardNotifications
Exit aufzurufen .Bearbeiten / Aktualisieren: Swift 4.2 Syntax
quelle
UIKeyboardFrameEndUserInfoKey
stattdessen verwendenUIKeyboardFrameBeginUserInfoKey
, weil letztere Höhe 0 zurückgeben. Und den schärfsten Punkt nach unten ändern, nicht Ursprung.if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
textField's didBeginEditing
Methode NACH dem Aufruf derkeyboardWillShow
Methode aufgerufen wird. Infolgedessen ist dieactiveField
Variable immer noch Null, was bedeutet, dass kein automatisches Scrollen stattfindet. Meine Lösung bestand darin, denactiveField = textField
Aufruf in dieshouldBeginEditing
Methode von textField einzufügen . Dies behebt das Problem mit der Reihenfolge der Anrufe.Hier sind meine 2 Cent:
Haben Sie versucht: https://github.com/hackiftekhar/IQKeyboardManager
Sehr einfach zu installierende Swift oder Objective-C.
Hier, wie es funktioniert:
IQKeyboardManager (Swift): - IQKeyboardManagerSwift ist über CocoaPods verfügbar. Um es zu installieren, fügen Sie einfach die folgende Zeile zu Ihrem Podfile hinzu: (# 236)
Importieren Sie in AppDelegate.swift einfach das IQKeyboardManagerSwift-Framework und aktivieren Sie IQKeyboardManager.
Und das ist alles. Einfach!
quelle
IQKeyboardManager.shared.enable = true
Ich fand, dass es perfekt für mich funktioniert:
Sie können auch die Höhenwerte ändern. Entfernen Sie die "if-Anweisung", wenn Sie sie für alle Textfelder verwenden möchten.
Sie können dies sogar für alle Steuerelemente verwenden, für die Benutzereingaben erforderlich sind, z. B. TextView.
quelle
Ich hatte ein ähnliches Problem und fand eine ziemlich einfache Lösung, ohne eine scrollView zu verwenden und stattdessen if-Anweisungen innerhalb der keyboardWillShow / Hide-Methoden zu verwenden.
Dies war eine gute Lösung für mich, da ich nur zwei Textfelder hatte.
Verschiebt die gesamte Ansicht nach oben: Nur wenn bestimmte Textfelder (bottomText) bearbeitet werden
Verschiebt die gesamte Ansicht nach unten: Nur wenn sich die Ansicht nicht am ursprünglichen Ort befindet
quelle
Verwenden Sie einfach diese Erweiterung, um UIView zu verschieben, wenn die Tastatur angezeigt wird.
Binden Sie dann in Ihrem viewdidload Ihre Ansicht an die Tastatur
quelle
Warum implementieren Sie dies nicht stattdessen in einem UITableViewController? Die Tastatur versteckt keine Textfelder, wenn sie angezeigt wird.
quelle
Swift 4 (** aktualisiert ) mit Erweiterung **
inViewDidLoad
Fügen Sie die folgende Erweiterung hinzu
quelle
Ich verwende SwiftLint, das einige Probleme mit der Formatierung der akzeptierten Antwort hatte. Speziell:
Kein Leerzeichen vor dem Doppelpunkt, kein Force Casting, bevorzugen Sie UIEdgeInset (oben: etc ... anstelle von UIEdgeInsetMake.
Hier sind die Updates für Swift 3
quelle
Ich denke, diese Klausel ist falsch:
Während der Ursprung des activeField möglicherweise über der Tastatur liegt, kann es sein, dass das maxY nicht ...
Ich würde einen 'max'-Punkt für das activeField erstellen und prüfen, ob dies in der Tastatur Rect ist.
quelle
Hier ist meine Version, nachdem ich die Dokumentation von Apple und die vorherigen Beiträge gelesen habe. Eine Sache, die mir aufgefallen ist, ist, dass die Textansicht nicht verarbeitet wurde, wenn sie von der Tastatur abgedeckt wurde. Leider funktioniert die Dokumentation von Apple nicht, da die Tastatur aus irgendeinem Grund NACH dem Aufruf von textViewDidBeginEditing aufgerufen wird. Ich habe dies durch den Aufruf einer zentralen Methode behandelt, die prüft, ob die Tastatur angezeigt wird UND ob eine Textansicht oder ein Textfeld bearbeitet wird. Auf diese Weise wird der Prozess nur ausgelöst, wenn BEIDE Bedingungen vorliegen.
Ein weiterer Punkt bei textViews ist, dass ihre Höhe so sein kann, dass die Tastatur den unteren Rand der textView abschneidet und sich nicht anpasst, wenn der obere linke Punkt der Ansicht angezeigt wird. Der Code, den ich geschrieben habe, verwendet also den bildschirmbezogenen unteren linken Punkt einer Textansicht oder eines Textfelds und prüft, ob er in die bildschirmbezogenen Koordinaten der dargestellten Tastatur fällt, was bedeutet, dass die Tastatur einen Teil davon abdeckt.
Wenn Sie einen Navigationscontroller verwenden, setzt die Unterklasse auch die automatische Anpassung der Bildlaufansicht für Einfügungen auf false.
Es geht durch jede textView und jedes textField, um Delegaten für die Behandlung festzulegen
Setzen Sie Ihre Basisklasse einfach auf die hier erstellte Unterklasse, um Ergebnisse zu erzielen.
quelle
Es gibt bereits großartige Antworten, aber dies ist eine andere Art, mit dieser Situation umzugehen (mit Swift 3x ):
Rufen Sie zunächst die folgende Methode in auf
viewWillAppear()
Nun nehmen Sie eine
IBOutlet
vonUIView
den Top Einschränkungen IhresUIViewcontroller
wie folgt aus : (hierUIView
ist die Subview ,UIScrollView
dass Mittel sollten Sie eine habenUIScrollView
für allesubViews
)Und eine andere Variable wie die folgende und fügen Sie einen Delegaten hinzu, dh
UITextFieldDelegate
:Danach ist hier der magische Teil, fügen Sie einfach diesen folgenden Ausschnitt ein :
Nun der letzte Ausschnitt:
Vergessen Sie nicht, assign Delegierten auf alle Ihre
UITextField
s inUIStoryboard
Viel Glück!
quelle
Swift 3-Syntax:
Dies ist eine nette Methode, um das zu bekommen, was Sie wollen. Sie können "if" -Bedingungen für bestimmte Textfelder hinzufügen, aber dieser Typ funktioniert für alle ... Ich hoffe, er kann für alle nützlich sein
quelle
Deklarieren Sie zunächst eine Variable, um Ihr aktives UITextField zu identifizieren.
Schritt 1:-
Wie als
var activeTextField: UITextField
?Schritt 2: - Fügen Sie anschließend diese beiden Zeilen in viewDidLoad hinzu.
Schritt 3:-
Definieren Sie nun diese beiden Methoden in Ihrer Controller-Klasse.
quelle
Machen Sie eine Var von uitextfield
In Ihrer Ansicht wurde geladen
Kennen Sie das angeklickte Textfeld. Wahrscheinlich haben Sie Textfelder auf dem gesamten Bildschirm.
Überprüfen Sie, ob die Tastatur ein Textfeld abdeckt oder nicht.
Zurück zum Schließen der Tastatur
UPDATE: NSNotification.Name.UIKeyboardWillShow und NSNotification.Name.UIKeyboardWillHide werden in UIResponder.keyboardWillShowNotification bzw. UIResponder.keyboardWillHideNotification umbenannt.
quelle
Swift : Sie können dies tun, indem Sie überprüfen, welches Textfeld angezeigt wird.
quelle
Dieser Code verschiebt das Textfeld, das Sie bearbeiten, nach oben, damit Sie es in Swift 3 anzeigen können. Für diese Antwort müssen Sie Ihre Ansicht auch zu einem UITextFieldDelegate machen:
Und dann in viewDidLoad:
Welche Aufrufe (außerhalb von viewDidLoad):
quelle
Swift 3
quelle
Die akzeptierte Antwort ist fast perfekt. Aber ich muss
UIKeyboardFrameEndUserInfoKey
stattdessen verwenden,UIKeyboardFrameBeginUserInfoKey,
weil letztere die Keyborad-Höhe 0 zurückgeben. Und den schärfsten Punkt nach unten ändern, nicht den Ursprung.quelle
Swift 4 Meine Lösung wurde aktualisiert
Mit Constraint-Animation auf der Tastatur ein- / ausblenden, viel Spaß.
quelle
Swift 4
Sie können leicht
UITextField
mit der Tastatur mit Animation auf und ab bewegenquelle
Swift 4.2
Meine Lösung zentriert die Ansicht (vertikal) auf a
UITextField
wenn sich ihre Position unter der Tastatur befindet.Schritt 1: Erstellen Sie eine neue schnelle Datei und kopieren Sie die Einfügeklasse
UIViewWithKeyboard
.Schritt 2: Legen Sie im Interface Builder eine benutzerdefinierte Klasse für Ihre Top-Klasse fest
UIView
.quelle
Für schnell umgeschrieben 4.2
In ViewDidLoad ..
Verbleibende Funktionen
quelle
"Ich habe vergessen zu erwähnen, dass ich neu bei Swift bin :( Was wäre die richtige Syntax, um dies zu überprüfen? (Wie erhalte ich den Feldnamen in dieser Funktion?)"
OK . Bestätigen Sie zuerst das UITextFieldDelegate-Protokoll
Dann implementieren Sie die Funktion
Sie sollten beachten, dass der richtige Ansatz darin besteht, eine Bildlaufansicht zu verwenden und die Ansicht, die nach oben / unten verschoben werden soll, in der Bildlaufansicht zu platzieren und Tastaturereignisse entsprechend zu behandeln
quelle
Für Swift 4.2
Mit diesem Code können Sie das Moment der Y-Achse des Rahmens für eine bestimmte Bildschirmgröße des Geräts steuern.
PS: Dieser Code verschiebt den Frame basierend auf der Position von TextField nicht intelligent.
Erstellen Sie eine Erweiterung für UIDevice
Fügen Sie NotificationObserver in viewDidLoad hinzu
Wähler
quelle