Ich habe eine App mit einem Textfeld in der unteren Hälfte der Ansicht. Dies bedeutet, dass beim Eingeben des Textfelds die Tastatur das Textfeld abdeckt.
Wie würde ich vorgehen, um die Ansicht beim Tippen nach oben zu verschieben, damit ich sehen kann, was ich tippe, und sie dann wieder an ihren ursprünglichen Platz zurückzuschieben, wenn die Tastatur verschwindet?
Ich habe überall gesucht, aber alle Lösungen scheinen in Obj-C zu sein, die ich noch nicht ganz konvertieren kann.
Jede Hilfe wäre sehr dankbar.
ios
swift
uikit
nsnotificationcenter
uikeyboard
Alex Catchpole
quelle
quelle
it is actually needed to scroll view up when keyboard appears
Antworten:
Hier ist eine Lösung, ohne den Wechsel von einem Textfeld zu einem anderen zu handhaben:
Um dies zu lösen, ersetzen Sie die beiden Funktionen
keyboardWillShow/Hide
durch folgende:BEARBEITEN FÜR SWIFT 3.0:
BEARBEITEN FÜR SWIFT 4.0:
BEARBEITEN FÜR SWIFT 4.2:
quelle
UIKeyboardFrameEndUserInfoKey
anstattUIKeyboardFrameBeginUserInfoKey
die Tastaturgröße zu erhalten. Ich bin mir im Moment nicht sicher, warum, aber erstere werden konsistentere Ergebnisse liefern.UIKeyboardFrameBeginUserInfoKey
mitUIKeyboardFrameEndUserInfoKey
. Der erste gibt den Startrahmen der Tastatur an, der manchmal Null ist, während der zweite den Endrahmen der Tastatur angibt.Der einfachste Weg, der nicht einmal Code erfordert:
Das Objekt bewegt sich synchron mit der Tastatur automatisch nach oben.
quelle
DispatchQueue.main.async {}
zu beheben. Gute Arbeit! Daumen hoch!Eine der beliebtesten Antworten in diesem Thread verwendet den folgenden Code:
Es gibt ein offensichtliches Problem beim Versetzen Ihrer Ansicht um einen statischen Betrag. Auf einem Gerät sieht es gut aus, auf jeder anderen Größenkonfiguration jedoch schlecht. Sie müssen die Höhe der Tastatur ermitteln und diese als Versatzwert verwenden.
Hier ist eine Lösung, die auf allen Geräten funktioniert und den Randfall behandelt, bei dem der Benutzer das Textfeld für die Vorhersage während der Eingabe ausblendet.
Lösung
Es ist wichtig zu beachten, dass wir self.view.window als unseren Objektparameter übergeben. Dadurch erhalten wir Daten von unserer Tastatur, wie z. B. die Höhe!
Wir sorgen dafür, dass es auf allen Geräten gut aussieht, und behandeln den Fall, in dem der Benutzer das Textfeld für die Vorhersage hinzufügt oder entfernt.
Beobachter entfernen
Vergessen Sie nicht, Ihre Beobachter zu entfernen, bevor Sie die Ansicht verlassen, um zu verhindern, dass unnötige Nachrichten übertragen werden.
Update basierend auf Frage aus Kommentaren:
Wenn Sie zwei oder mehr Textfelder haben, können Sie überprüfen, ob Ihre view.frame.origin.y auf Null steht.
quelle
Fügen Sie dies Ihrem Viewcontroller hinzu. Klappt wunderbar. Passen Sie einfach die Werte an.
quelle
Ich habe eine der Antworten ein wenig verbessert, damit sie mit verschiedenen Tastaturen und verschiedenen Textansichten / Feldern auf einer Seite funktioniert:
Beobachter hinzufügen:
Beobachter entfernen:
quelle
Keine Werbung, Promotion oder Spam , nur eine gute Lösung. Ich weiß, dass diese Frage fast 30 Antworten hat und ich bin so schockiert, dass niemand einmal von diesem wunderschönen GitHub-Projekt gesprochen hat , das alles für Sie und noch besser macht. Alle Antworten verschieben nur die Ansicht nach oben. Ich habe gerade alle meine Probleme mit diesem IQKeyboardManager gelöst. Es hat mehr als 13000 Sterne.
Fügen Sie dies einfach in Ihre Poddatei ein, wenn Sie Swift verwenden
und dann in Ihrem AppDelegate.swift tun
import IQKeyboardManagerSwift
Fügen Sie die Zeile hinzu
IQKeyboardManager.shared.enable = true
, um sie zu aktivieren.Diese Lösung ist ein Muss, wenn Sie in Produktion gehen möchten.
quelle
import IQKeyboardManager
und verwendetIQKeyboardManager.shared().isEnabled = true
Für Black Screen Error (Swift 4 & 4.2) .
Ich habe das Problem mit dem schwarzen Bildschirm behoben. In der verifizierten Lösung Die Tastaturhöhe ändert sich nach dem Tippen und dies führt zu einem schwarzen Bildschirm.
Haben Sie verwenden UIKeyboardFrameEndUserInfoKey statt UIKeyboardFrameBeginUserInfoKey
quelle
Ich sehe, dass alle Antworten die Ansicht selbst um den Wert der Tastaturhöhe verschieben. Nun, ich habe eine ausführliche Antwort, die nützlich sein kann, wenn Sie Einschränkungen verwenden, dh
autolayout
eine Ansicht verschieben, indem Sie den Einschränkungswert (z. B. untere oder obere Einschränkungen) um einen vordefinierten Wert ändern oder den Tastaturgrößenwert verwenden.In diesem Beispiel verwende ich die untere Einschränkung vom Textfeld zur unteren Layoutansicht mit dem Anfangswert 175.
quelle
Es wurden einige Änderungen an der Definition der KeyboardWillHideNotification vorgenommen.
Diese Lösung funktioniert mit Swift 4.2 :
quelle
Nach 4-5 Stunden Kampf kam ich mit einer einfachen Erweiterung von UIViewController mit einfachem Code, der wie Charme funktioniert
* Die Ansicht sollte sich nicht bewegen, wenn sich TextField über der Tastatur befindet
* Es ist nicht erforderlich, einen konstanten Wert auf NSLayoutConstraint festzulegen
* Keine Bibliothek von Drittanbietern erforderlich
* Kein Animationscode erforderlich
* Funktioniert auch in der Tabellenansicht
* Dies funktioniert bei automatischem Layout / automatischer Größenänderung
Fügen Sie diese UIResponder-Erweiterung hinzu, um zu ermitteln, welches TextField ausgewählt ist
Verwenden Sie dies dann in einem beliebigen ViewController
Registrieren Sie diese Benachrichtigung in
func viewWillAppear(_ animated: Bool)
Melden Sie diese Benachrichtigung in ab
func viewWillDisappear(_ animated:Bool)
Demo hier herunterladen
quelle
Für Swift 3 habe ich eine UIViewController-Unterklasse erstellt, da ich in allen View Controllern ein konstantes Verhalten benötigte.
quelle
Die validierte Antwort berücksichtigt nicht die Position des Textfelds und weist einen Fehler auf (doppelte Verschiebung, nie wieder an die primäre Position zurückkehren, Verschiebung, selbst wenn sich das Texfeld oben in der Ansicht befindet ...)
Die Idee ist:
dann können wir die Ansicht nur bei Bedarf und der spezifischen Verschiebung verschieben, um das fokussierte texField direkt über der Tastatur zu haben
Hier ist der Code:
Swift 4
}}
quelle
Ich bemerkte, dass die anderen Antworten darin bestanden, einen Teil der Oberseite aus der Ansicht herauszuschneiden. Wenn Sie einfach die Größe der Ansicht ändern möchten, ohne Inhalte zu schneiden, versuchen Sie einfach diese Methode :)
quelle
Meine zwei Cent für Anfänger: In den obigen Beispielen ändert jemand die Koordinaten, andere verwenden "Autoresizing-Maske" und andere Einschränkungen:
Mischen Sie diese drei Arten von Logik nicht, wie Apple sagt. Wenn Sie Einschränkungen im Storyboard haben, versuchen Sie nicht, x / y zu ändern. Es funktioniert definitiv nicht.
quelle
Keine der anderen Antworten scheint es richtig zu machen.
Die gut benommene Tastatur unter iOS sollte:
Mein Code verwendet eine
NSLayoutConstraint
als deklarierte@IBOutlet
Sie können auch Transformationen verwenden, Offsets anzeigen, ... Ich denke, es ist einfacher mit der Einschränkung tho. Es funktioniert, indem eine Einschränkung nach unten gesetzt wird. Möglicherweise müssen Sie den Code ändern, wenn Ihre Konstante nicht 0 / Nicht nach unten ist.
Hier ist der Code:
quelle
seine 100% perfekte Antwort für alle Guy's Table Tableview Höhe beim Öffnen der Tastatur
Für Swift4.2
Swift3.2
quelle
Für Swift 3
quelle
Swift 4:
Ich hatte ein Problem mit der am meisten akzeptierten Antwort, bei dem das Ausblenden der Tastatur die Ansicht nicht bis zum Ende der Seite (nur teilweise) zurückbrachte. Dies hat bei mir funktioniert (+ aktualisiert für Swift 4).
quelle
Ähnlich wie bei @Boris, aber in Swift 5 :
quelle
Hier ist meine Lösung (tatsächlich ist dieser Code für den Fall gedacht, dass Sie nur wenige Textfelder in Ihrer Ansicht haben, dies funktioniert auch für den Fall, dass Sie ein Textfeld haben).
quelle
Aktualisiert für Swift 3 ...
Wie bereits erwähnt, müssen Sie der viewDidLoad () -Methode Ihres Controllers Benachrichtigungsbeobachter wie folgt hinzufügen:
Denken Sie daran, Ihre Beobachter gegebenenfalls zu entfernen (ich mache das in der viewWillDisappear () -Methode).
Implementieren Sie dann Ihre Methoden zum Ein- und Ausblenden. Beachten Sie die Zeile, in der die App aufgefordert wird, Interaktionsereignisse zu ignorieren (beginIgnoringInteractionEvents). Dies ist wichtig, da der Benutzer ohne dieses Feld auf ein Feld oder sogar eine Bildlaufansicht tippen und die Verschiebung ein zweites Mal durchführen kann, was zu einem schrecklichen Fehler in der Benutzeroberfläche führt. Das Ignorieren von Interaktionsereignissen vor dem Ein- und Ausblenden der Tastatur verhindert Folgendes:
Zuletzt aktivieren Sie die Benutzerinteraktionen erneut (denken Sie daran, dass diese Methode ausgelöst wird, nachdem die Tastatur didShow oder didHide ausgeführt wurde):
quelle
Swift 3 Code
quelle
Wenn Sie zwei oder mehr Textfelder in derselben VC haben und der Benutzer auf eines von ihnen tippt und dann auf das andere tippt, ohne die Funktion keyboardWillHide aufzurufen, wird die Ansicht noch einmal nach oben verschoben, was nicht erforderlich ist, da Sie haben die Tastatur, ein Leerzeichen mit der Höhe der Tastatur und dann die Ansicht. Verwenden Sie dazu den Code in der Antwort, die ich bearbeitet habe:
Um dies zu lösen, ersetzen Sie die beiden Funktionen "KeyboardWillShow / Hide" durch folgende:
quelle
@ Boris 'Lösung ist SEHR gut, aber die Ansicht kann manchmal beschädigt sein.
Verwenden Sie für die perfekte Ausrichtung den folgenden Code
Funktionen:
Und,
quelle
Dieses Video-Tutorial ist das Beste. 7 Minuten lang und es wird einfach so viel Sinn machen. Eine so einfache Lösung, wenn Sie mehrere Textfelder haben und möchten, dass die Bildlaufansicht die Anzahl der Pixel um "x" verschiebt, wenn auf dieses bestimmte Textfeld getippt wird.
https://youtu.be/VuiPGJOEBH4
Nur diese Schritte:
- Platzieren Sie alle Textfelder in einer Bildlaufansicht, die auf die Ränder der Ansicht beschränkt ist.
-Verbinden Sie alle Textfelder und die Bildlaufansicht als Delegierte an den Ansichtscontroller.
- Verbinden Sie alle Textfelder und die Bildlaufansicht mit einem IBOutlet.
- Fügen Sie Ihrer Klasse das UITextFieldDelegate-Protokoll hinzu
- Fügen Sie Ihrer schnellen Datei UITextFieldDelegate-Methoden hinzu:
Die erste Methode aktiviert nur die Eingabetaste auf der Tastatur, um die Tastatur zu schließen. Das zweite ist, wenn Sie auf ein bestimmtes Textfeld tippen und dann den y-Versatz festlegen, um wie weit Ihre Bildlaufansicht rollt (meiner basiert auf der y-Position auf meinen Ansichts-Controllern 25, 57, 112, 142). Der letzte sagt, wenn Sie von der Tastatur weg tippen, kehrt die Bildlaufansicht zum ursprünglichen Speicherort zurück.
Auf diese Weise habe ich mein Ansichtspixel perfekt gemacht!
quelle
Diese Funktion wurde in Ios integriert, wir müssen sie jedoch extern ausführen.
Fügen Sie den folgenden Code ein
* Verschieben der Ansicht, wenn sich textField unter der Tastatur befindet,
* Verschieben der Ansicht nicht, wenn sich textField über der Tastatur befindet
* Verschieben der Ansicht basierend auf der Höhe der Tastatur bei Bedarf.
Dies funktioniert und wird in allen Fällen getestet.
| :: | Manchmal ist die Ansicht nicht verfügbar. In diesem Fall verwenden Sie die Höhe +/- 150:
quelle
es muss stabiler sein
quelle
quelle
Verwenden Sie den folgenden Code für die Ansicht Nach oben auf UITextField
quelle
Ich habe einen Cocoapod gemacht, um die Sache zu vereinfachen:
https://github.com/xtrinch/KeyboardLayoutHelper
Wie man es benutzt:
Nehmen Sie eine untere Einschränkung für das automatische Layout vor, geben Sie ihr im Modul KeyboardLayoutHelper eine Klasse von KeyboardLayoutConstraint, und der Pod erledigt die erforderliche Arbeit, um sie zu vergrößern, um das Erscheinen und Verschwinden der Tastatur zu berücksichtigen. Im Beispielprojekt finden Sie Beispiele für die Verwendung (ich habe zwei erstellt: textFields in einer scrollView und vertikal zentrierte textFields mit zwei grundlegenden Ansichten - login & register).
Die unterste Layoutbeschränkung kann die Containeransicht, das Textfeld selbst oder alles sein, was Sie nennen.
quelle