Ich benutze Swift zum Programmieren mit iOS und ich benutze diesen Code, um das zu verschieben UITextField
, aber es funktioniert nicht. Ich rufe die Funktion keyboardWillShow
korrekt auf, aber das Textfeld bewegt sich nicht. Ich benutze Autolayout.
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);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Pedro Manfredi
quelle
quelle
Antworten:
An den vorhandenen Antworten müssen einige Verbesserungen vorgenommen werden.
Erstens ist die UIKeyboardWillChangeFrameNotification wahrscheinlich die beste Benachrichtigung, da sie Änderungen behandelt, die nicht nur ein- / ausgeblendet werden, sondern auch aufgrund von Tastaturänderungen (Sprache, Verwendung von Tastaturen von Drittanbietern usw.) und Drehungen (beachten Sie jedoch den Kommentar unten, der angibt, dass die Tastatur ausgeblendet werden soll) auch zur Unterstützung der Hardware-Tastaturverbindung behandelt werden).
Zweitens können die Animationsparameter aus der Benachrichtigung abgerufen werden, um sicherzustellen, dass die Animationen ordnungsgemäß zusammengefügt werden.
Es gibt wahrscheinlich Optionen, um diesen Code etwas genauer zu bereinigen, insbesondere wenn Sie mit dem erzwungenen Auspacken des Wörterbuchcodes vertraut sind.
Swift 3
(Bearbeitet, um Tastaturanimationen außerhalb des Bildschirms zu berücksichtigen, anstatt sie zu verkleinern, wie in @ Gabox 'großartigem Kommentar unten angegeben)
Swift 5
quelle
endFrame?.size.height
es nicht Null ist. Ich habe den Endrahmen alsUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Lief auf iOS 8.3 iPad Simulator, Portrait. Xcode6.3 Beta4..UIKeyboardWillChangeFrame
dies nicht ausgelöst wird, wenn eine Hardwaretastatur angeschlossen ist, obwohl die iOS-Tastatur verschwindet. Sie müssen auch beobachten.UIKeyboardWillHide
, um diesen Randfall zu fangen.Wenn Sie das automatische Layout verwenden, haben Sie vermutlich die Einschränkung für den unteren Bereich auf Superview festgelegt . In diesem Fall müssen Sie lediglich den Wert der Einschränkung aktualisieren. So machen Sie es mit ein bisschen Animation.
Die fest codierte 20 wird nur hinzugefügt, um das Textfeld über der Tastatur ein wenig zu öffnen. Andernfalls würden sich der obere Rand der Tastatur und der untere Rand des Textfelds berühren.
Wenn die Tastatur geschlossen wird, setzen Sie den Wert der Einschränkung auf den ursprünglichen Wert zurück.
quelle
UIKeyboardWillShowNotification
Benachrichtigung registrieren . Schauen Sie sich den Code in der Frage des OP an.animateWithDuration
und rufen Sieself.view.layoutIfNeeded()
innerhalb des Animationsblocks auf.Eine einfache Lösung besteht darin, die Ansicht mit konstanter Tastaturhöhe nach oben zu verschieben.
Swift 5:
quelle
self.view.frame.origin.y -= 150
verwendenself.view.frame.origin.y = -150
und stattself.view.frame.origin.y += 150
Verwendungself.view.frame.origin.y = 0
. Dies verhindert, dass sich die Ansicht jedes Mal um 150 bewegt, wenn ein neues Feld berührt wird.Um Ihre Ansicht beim Bearbeiten des Textfelds zu verschieben, versuchen Sie Folgendes: Ich habe Folgendes angewendet:
Option 1: - ** ** Aktualisierung in Swift 5.0 und iPhone X, XR, XS und XS Max Move mithilfe von NotificationCenter
Registrieren Sie diese Benachrichtigung in
func viewWillAppear(_ animated: Bool)
Melden Sie diese Benachrichtigung in ab
func viewWillDisappear(_ animated: Bool)
Hinweis: - Wenn Sie sich nicht abmelden, wird es von der untergeordneten Klasse aufgerufen und führt zum Absturz oder sonst.
Option 2: - Es funktioniert gut
Ich habe diese Antwort von dieser Quelle erhalten. UITextField wird nach oben verschoben, wenn die Tastatur in Swift angezeigt wird
IN der Swift 4 ---
quelle
Ich liebe sauberen Swift-Code. Hier ist der engste Code, den ich finden könnte, um eine Textansicht mit der Tastatur nach oben / unten zu verschieben. Es funktioniert derzeit in einer iOS8 / 9 Swift 2-Produktions-App.
UPDATE (März 2016): Ich habe gerade meinen vorherigen Code so weit wie möglich verschärft. Außerdem gibt es hier eine Reihe beliebter Antworten, die die Tastaturhöhe und die Animationsparameter fest codieren. Das ist nicht nötig, ganz zu schweigen davon, dass die Zahlen in diesen Antworten nicht immer mit den tatsächlichen Werten übereinstimmen, die ich auf meinem 6s + iOS9 sehe (Tastaturhöhe 226, Dauer 0,25 und Animationskurve 7). In jedem Fall ist es fast kein zusätzlicher Code, um diese Werte direkt vom System zu erhalten. Siehe unten.
HINWEIS: Dieser Code deckt den meisten Kommentar / allgemeinen Fall ab. Möglicherweise ist jedoch mehr Code erforderlich, um unterschiedliche Ausrichtungen und / oder benutzerdefinierte Tastaturen zu handhaben. Hier finden Sie einen ausführlichen Artikel zur Arbeit mit der iOS-Tastatur. Wenn Sie jedes Szenario bewältigen müssen, kann dies hilfreich sein.
quelle
as
für Force Casts verwendet wird.as!
mag funktionieren, aber wie Sie an anderer Stelle auf dieser Seite sehen können, vermeide ich das Wirken von Gewalt und das gewaltsame Auspacken.baseConstraint
, könnte esbaseConstraint.constant = moveUp ? keyboardHeight : 0
statt seinbaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Bearbeiten : Ich empfehle eine einfachere und sauberere Lösung. Ändern Sie einfach die Klasse der unteren Abstandsbeschränkung in KeyboardLayoutConstraint . Es wird automatisch auf die Tastaturhöhe erweitert.
Dies ist eine verbesserte Version der Antwort von @JosephLord.
Wie auf iOS 8.3 iPad Simulator, Portrait getestet. Xcode6.3 Beta4, ich fand, dass seine Antwort nicht funktioniert, wenn sich die Tastatur versteckt, weil
UIKeyboardFrameEndUserInfoKey
ist"NSRect: {{0, 1024}, {768, 264}}";
. Die Höhe ist nie0
.Dies geht zurück, um das Traditionelle zu verwenden
UIKeyboardWillShowNotification
undUIKeyboardWillHideNotification
besser zu erkennen, wann sich die Tastatur versteckt, anstatt sich auf die Höhe des Endrahmens zu verlassen.UIKeyboardWillShowNotification
wird auch gesendet, wenn der Tastaturrahmen geändert wird, sodass alle Anwendungsfälle abgedeckt werden sollen.quelle
Ich arbeite mit Swift 4 und ich habe dieses Problem ohne zusätzliche untere Einschränkung gelöst. Schauen Sie, mein Code ist hier. Es funktioniert wirklich an meinem Fall
1) Fügen Sie Notification Observer in did load hinzu
2) Entfernen Sie Notification Observer wie
3) Fügen Sie Tastatur-Ein- / Ausblendmethoden wie hinzu
4) Fügen Sie einen Textfeild-Delegaten hinzu und fügen Sie touchBegan-Methoden hinzu. Verwenden Sie diese Option, um die Tastatur auszublenden, wenn Sie außerhalb des Textfeilds auf dem Bildschirm berühren
quelle
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
Umbenannt wirdUIResponder.keyboardWillShowNotification
auchUIKeyboardFrameBeginUserInfoKey
zuUIResponder.keyboardFrameBeginUserInfoKey
Dies ist eine verbesserte Version der Antwort von @JosephLord und @ Hlung. Es kann gelten, ob Sie eine Registerkarte haben oder nicht. Und es würde die Ansicht, die mit der Tastatur an die ursprüngliche Position verschoben wird, perfekt wiederherstellen.
quelle
Der einfachste Weg, der keinen Code erfordert:
Das Objekt bewegt sich synchron mit der Tastatur automatisch nach oben.
quelle
Ich habe ein Swift 3-Protokoll erstellt, um das Erscheinungsbild / Verschwinden der Tastatur zu behandeln
Gehen Sie dann wie folgt vor, um es in einem UIViewController zu implementieren:
Lassen Sie den viewController diesem Protokoll entsprechen:
Beobachten Sie Tastaturänderungen in viewWillAppear:
Beobachten Sie keine Tastaturänderungen mehr in viewWillDisappear:
Erstellen Sie im Storyboard ein IBOutlet für die unterste Einschränkung:
(Ich empfehle, Ihre gesamte Benutzeroberfläche in eine "contentView" einzubetten und die untere Einschränkung von dieser contentView mit der unteren Layoutanleitung mit dieser Eigenschaft zu verknüpfen.)
Ändern Sie die Einschränkungspriorität der obersten Einschränkung auf 250 (niedrig).
Auf diese Weise kann die gesamte Inhaltsansicht nach oben verschoben werden, wenn die Tastatur angezeigt wird. Die Priorität muss niedriger sein als jede andere Einschränkungspriorität in den Unteransichten, einschließlich Prioritäten für Inhaltsumarmung / Inhaltskomprimierungswiderstand.
Möglicherweise müssen Sie hierfür eine Einschränkung "größer als gleich" hinzufügen:
Und los geht's!
quelle
import UIKit
Eine solche einfache
UIViewController
Erweiterung kann verwendet werdenAnwendungsbeispiel
Swift 4-Lösung
Swift 4.2
quelle
removeKeyboardObserver()
Methode hier entfernt den Beobachter nicht wirklich. Wenn Sie dies nicht aufrufen, wirdInvalid conditions for UIKeyboardWillChangeFrameNotification
in der Konsole ein von der add-Methode angezeigt. Wenn Sie dies aufrufen, wird derselbe Fehler angezeigt, was bedeutet, dass der Beobachter nicht entfernt wird. In der Dokumentation heißt es: "Um die Registrierung von Beobachtungen aufzuheben, übergeben Sie das von dieser Methode zurückgegebene Objekt anremoveObserver(_:)
." Stattdessen speichern Sie das von dieser Methode zurückgegebene Objekt und übergeben es, wenn Sie den Beobachter entfernen möchten.Sie können diese Bibliothek verwenden und nur eine Codezeile in appDidFinishedLaunching und Sie sind fertig.
IQKeyboardManager - Passen Sie die Ansicht an, wenn die Tastatur angezeigt wird. Link - https://github.com/hackiftekhar/IQKeyboardManager
quelle
Und schließlich, da wir Delegatenmethoden verwenden
Refactored von der Verwendung von Objective-C http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
quelle
var animateDistance: CGFloat!
ausführen musste: Deklarieren Sie ein Plus Ich musste die UIKeyboardWillHideNotification verarbeiten, wenn der Benutzer die Tastaturtaste zum Ausblenden drückt.Eine andere Lösung, die nicht von Autolayout, Einschränkungen oder Steckdosen abhängt. Was Sie brauchen, sind Ihre Felder in einer Bildlaufansicht.
quelle
UIKeyboardWillShowNotification
Aufruf.Hier ist meine Version für eine Lösung für Swift 2.2:
Registrieren Sie sich zuerst für Benachrichtigungen zum Ein- / Ausblenden der Tastatur
Verschieben Sie dann in Methoden, die diesen Benachrichtigungen entsprechen, die Hauptansicht nach oben oder unten
Der Trick liegt im Teil "keyboardWillShow", der jedes Mal Anrufe erhält, wenn die "QuickType-Vorschlagsleiste" erweitert oder reduziert wird. Dann setzen wir immer die y-Koordinate der Hauptansicht, die dem negativen Wert der gesamten Tastaturhöhe entspricht (mit oder ohne den Abschnitt "QuickType-Leiste").
Vergessen Sie am Ende nicht, Beobachter zu entfernen
quelle
Das Folgende ist eine einfache Lösung, bei der das Textfeld eine Einschränkung aufweist, die es an die untere Layoutanleitung bindet. Es fügt einfach die Tastaturhöhe zur Konstante der Einschränkung hinzu.
quelle
Nun, ich denke, ich bin vielleicht zu spät, aber ich habe eine andere einfache Version von Saqibs Antwort gefunden. Ich verwende Autolayout mit Einschränkungen. Ich habe eine kleine Ansicht in einer anderen Hauptansicht mit Feldern für Benutzername und Passwort. Anstatt die y-Koordinate der Ansicht zu ändern, speichere ich den ursprünglichen Einschränkungswert in einer Variablen und ändere die Konstante der Einschränkung auf einen bestimmten Wert. Nachdem die Tastatur geschlossen wurde, richte ich die Einschränkung auf den ursprünglichen Wert ein. Auf diese Weise wird das Problem vermieden, das Saqibs Antwort hat (Die Ansicht bewegt sich weiter nach oben und hört nicht auf). Unten ist mein Code ...
quelle
Schnelle 4.x-Antwort, bei der die Antworten von @Joseph Lord und @Isuru zusammengeführt werden.
bottomConstraint
stellt die unterste Einschränkung der Ansicht dar, die Sie verschieben möchten.quelle
Ich habe auf folgende Weise getan:
Dies ist nützlich, wenn die Textfeldübersicht angezeigt wird
quelle
quelle
Ich habe auf folgende Weise getan:
quelle
Wenn Sie wie ich sind, der alle oben genannten Lösungen ausprobiert hat und Ihr Problem immer noch nicht gelöst ist, habe ich eine großartige Lösung für Sie, die wie ein Zauber wirkt. Zunächst möchte ich einige Dinge über einige der oben genannten Lösungen klarstellen.
quelle
Hier ist eine generische Lösung für alle TextField-Schritte -
1) Erstellen Sie einen gemeinsamen ViewController, der von anderen ViewControllern erweitert wird
2) Erstellen Sie eine Erweiterung von UIViewController und dem aktuell aktiven TextField
Erweiterung UIViewController {func getSelectedTextField () -> UITextField? {
}}
quelle
Sehr einfach und keine Notwendigkeit, mehr zu codieren.
pod 'IQKeyboardManagerSwift'
Fügen Sie einfach Ihre Poddatei hinzu und fügen Sie auf IhrerAppDelegate
Seite den folgenden Code hinzu.und in
didFinishLaunchingWithOptions()
Verfahrenstypdas ist es. Überprüfen Sie diesen Videolink, um https://youtu.be/eOM94K1ZWN8 besser zu verstehen. Ich hoffe, dies wird Ihnen helfen.
quelle
Vollständiger Code zur Verwaltung der Tastatur.
quelle
Ich habe die @ Simpa-Lösung ein wenig modifiziert .........
quelle
Keiner von ihnen hat funktioniert, und ich habe schließlich Inhaltseinfügungen verwendet, um meine Ansicht nach oben zu verschieben, wenn die Tastatur angezeigt wird.
Hinweis: Ich habe eine UITableView verwendet
Referenzierte Lösung @ Keyboard-Content-Offset die vollständig in Ziel C geschrieben wurde. Die folgende Lösung ist Clean Swift.
Fügen Sie den Benachrichtigungsbeobachter @ viewDidLoad () hinzu.
Um die Tastaturgröße zu ermitteln, rufen wir zuerst das userInfo-Wörterbuch aus dem Benachrichtigungsobjekt ab, in dem alle zusätzlichen Objekte gespeichert sind, die unser Empfänger möglicherweise verwendet.
Aus diesem Wörterbuch können wir das CGRect-Objekt erhalten, das den Rahmen der Tastatur beschreibt, indem wir die Taste UIKeyboardFrameBeginUserInfoKey verwenden.
Wenden Sie den Inhaltseinsatz für die Methode table view @ keyboardWillBeShown an.
Stellen Sie die Methode view @ keyboardWillBeHidden wieder her
Wenn Sie auch die Geräteorientierung berücksichtigen möchten, verwenden Sie bedingte Anweisungen, um den Code an Ihre Anforderungen anzupassen.
quelle
quelle
Die Swift 4-Lösung, die ich verwende, nimmt die Tastaturgröße an. Ersetzen Sie
serverStatusStackView
mit dem, was sehen Sie kümmern uns um, zum Beispiel:self.view
:quelle
Am besten verwenden Sie NotificationCenter, um Tastaturaktionen abzufangen. Sie können den Schritten in diesem kurzen Artikel https://medium.com/@demirciy/keyboard-handling-deb1a96a8207 folgen
quelle