Ich habe eine App, in der ich in Interface Builder eine eingerichtet habeUIView
mit einem Textfeld am unteren Rand der Ansicht eingerichtet habe. Wenn ich die App starte und versuche, Text in dieses Feld einzugeben, wird die Tastatur über das Feld geschoben, sodass ich nicht sehen kann, was ich tippe, bis ich die Tastatur wieder ausgeblendet habe.
Ist jemand anderes auf dieses Problem gestoßen und hat einen guten Weg gefunden, es zu lösen, ohne die übergeordnete Ansicht scrollbar zu machen oder das Textfeld weiter nach oben zu verschieben?
ios
iphone
keyboard
uitextfield
Cruinh
quelle
quelle
Antworten:
Die übliche Lösung besteht darin, das Feld (und alles darüber) mit einer Animation nach oben und dann wieder nach unten zu schieben, wenn Sie fertig sind. Möglicherweise müssen Sie das Textfeld und einige der anderen Elemente in eine andere Ansicht einfügen und die Ansicht als Einheit verschieben. (Ich nenne diese Dinge "Platten" wie bei "tektonischen Platten", aber das bin nur ich). Aber hier ist die allgemeine Idee, wenn Sie keine Lust haben müssen.
quelle
Das hat Wunder gewirkt, als ich Uitextfelder verschoben habe
Insbesondere hat es den Vorteil, dass der Abstand der Folienanimation in Abhängigkeit von der Position des Textfelds berechnet wird.
quelle
IQKeyboardManager tun dies für Sie mit NO Codezeile , nur zu ziehen müssen und damit verbundene Quelle Projektdatei löschen. IQKeyboardManager auch unterstützen Geräteausrichtung , automatische UIToolbar - Management , keyboardDistanceFromTextField und viel mehr , als Sie denken.
Hier ist das Kontrollflussdiagramm:
Schritt 1: - Hinzugefügt globale Meldungen von
UITextField
,UITextView
undUIKeyboard
in einer Singleton - Klasse. Ich habe es IQKeyboardManager genannt .Schritt 2: - Wenn Sie gefunden werden
UIKeyboardWillShowNotification
,UITextFieldTextDidBeginEditingNotification
oderUITextViewTextDidBeginEditingNotification
Benachrichtigungen, dann versuchen zu bekommentopMostViewController
Instanz aus derUIWindow.rootViewController
Hierarchie. Um richtig aufzudeckenUITextField
/UITextView
Sie darauftopMostViewController.view
braucht ‚s Rahmen angepasst werden.Schritt 3: - Berechnete erwartete Bewegungsentfernung in
topMostViewController.view
Bezug auf die zuerst beantworteteUITextField
/UITextView
.Schritt 4: -
topMostViewController.view.frame
Entsprechend der erwarteten Bewegungsentfernung nach oben / unten bewegt.Schritt 5: - Wenn Sie gefunden werden
UIKeyboardWillHideNotification
,UITextFieldTextDidEndEditingNotification
oderUITextViewTextDidEndEditingNotification
Benachrichtigung, dann versuchen Sie es erneut zu bekommentopMostViewController
Instanz aus derUIWindow.rootViewController
Hierarchie.Schritt 6: - Berechnete gestörte Entfernung,
topMostViewController.view
deren ursprüngliche Position wiederhergestellt werden muss.Schritt 7: - Wiederhergestellt
topMostViewController.view.frame
Entsprechend der gestörten Entfernung .Schritt 8: - Instanziierte Singleton- IQKeyboardManager- Klasseninstanz beim Laden der App, sodass jedes
UITextField
/UITextView
in der App automatisch an die erwartete Bewegungsentfernung angepasst wird.Das ist alles
quelle
Um die Amagrammer-Antwort zu erweitern, finden Sie hier eine Beispielklasse:
LoginViewController.h
Beachten Sie, dass wir das "UITextFieldDelegate" implementieren.
LoginViewController.m
quelle
UIApplicationDidEnterBackgroundNotification
, sonst bewegt es sich mehr nach unten, wenn man die Home-Taste drückt und wieder in die App kommt, was dazu führt, dass sie hässlich und fehlerhaft ist.Wie wäre es mit der offiziellen Lösung: Verschieben von Inhalten, die sich unter der Tastatur befinden
quelle
Ich habe das gleiche Problem in
UITableView
textField-Zellen. Ich löse dieses Problem, indem ich die folgende Methode implementiere, um die Tastaturbenachrichtigung abzuhören.Beobachter für die Benachrichtigungen hier:
Behandeln Sie diese Benachrichtigung mithilfe der folgenden Funktion:
quelle
Überprüfen Sie dies heraus. Kein Ärger für dich.
Diese Lösung ist sehr ordentlich. Alles, was Sie tun müssen, ist, Ihre Textfelder in a hinzuzufügen
UIScrollView
und ihre Klasse in zu ändernTPKeyboardAvoidingScollView
, wenn Sie Storyboards verwenden. Die Bildlaufansicht wird so erweitert, dass sie erkennt, wann die Tastatur sichtbar ist, und sich in angemessenem Abstand über der Tastatur bewegt. Es ist die perfekte Lösung, weil es unabhängig von Ihnen istUIViewController
. Alles Notwendige wird innerhalb der oben genannten Klasse erledigt. Vielen Dank an Michael Tyson und alle.TPKeyboardAvoiding
quelle
Unten finden Sie eine schnelle Version von Amagrammers Antwort. Auch eine Variation mit dem UIKeyboardWillShowNotification-Ereignis, da ich die Tastaturgröße kennen musste, bevor ich die Ansicht aus dem Weg räumen konnte.
quelle
Es gab eine großartige Anleitung zum Bearbeiten von Textfeldern ohne Verschleierung (Link jetzt tot, hier ist ein Wayback-Link: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / editing-textfields-without-obscuring.html ). Es zeigt, wie Sie ein vorhandenes
UIView
Objekt auf einUIScrollView
Objekt verschieben und es automatisch scrollen, wenn die Tastatur angezeigt wird.Ich habe es ein wenig aktualisiert, um die richtige Höhe für den Fall zu berechnen,
UIScrollView
dass sich Steuerelemente (wie z. B. aUITabBar
) unter dem befindenUIScrollBar
. Siehe Beitrag Aktualisierung uiview .quelle
Hier ist eine Lösung mit Xcode5, iOS7:
Verwenden Sie die Blöcke UITextfieldDelegate und Animation.
Dies ist fast der gesamte Code für den ViewController, aber ich wollte den Delegatencode für diejenigen einschließen, die mit dem Delegatenmuster noch nicht vertraut sind (wie ich). Ich habe auch Code eingefügt, um die Tastatur auszublenden, wenn Sie von der Textansicht weg tippen.
Sie können die Ansichten (Schaltflächen, Textfelder usw.) so hoch verschieben, wie Sie möchten. Stellen Sie lediglich sicher, dass sie wieder angebracht sind (+100, später -100).
quelle
Ich denke, eine Möglichkeit wäre, die Position Ihrer gesamten Ansicht von (x, y) nach (x, y-keybaardHeight) zu verschieben, wenn Sie auf das Textfeld klicken, und es zurückzusetzen, wenn die Tastatur geschlossen wird kommt auf (vielleicht wäre es nicht schlecht, wenn Sie es animieren).
quelle
Wenn Sie cocos2d im Hochformat verwenden, ändern Sie zusätzlich zur Amagrammer-Lösung diese Zeile:
dazu:
Wenn Sie cocos2d im Querformat verwenden, nehmen Sie die obigen Änderungen vor und wechseln Sie die
up
Werte intextFieldDidBeginEditing:
undtextFieldDidEndEditing:
quelle
Ich hatte das gleiche Problem und fand, dass GTKeyboardHelper ein einfacher Ausweg ist.
Fügen Sie nach dem Ziehen und Ablegen des Frameworks in Ihr Projekt die Header-Datei hinzu. Laden Sie das Beispielprojekt herunter, öffnen Sie es und ziehen Sie das Objekt "Keyboard Helper" aus dem Objektbereich in der xib in den Objektbereich im Interface Builder Ihres Projekts.
Ziehen Sie alle Ihre Ansichten per Drag & Drop, um Kinder des "Keyboard Helper" zu sein.
quelle
Drag & Drop-Framework, das ich in meinen Projekten verwende. Unterstützt die automatische Entlassung, wenn Sie außerhalb eines Ersthelfers tippen oder wenn Sie einen Bildlauf durchführen.
GTKeyboardHelper
quelle
Schieben Sie die Ansicht nach Bedarf nach oben und unten:
Vergessen Sie nicht,
self
alsUITextFieldDelegate
und als eigentliches Textfeld festzulegendelegate
.(Dank Ammagrammer ist dies nur eine kürzere Antwort, bei der Blöcke für Animationen verwendet werden.)
quelle
Ich habe noch etwas, wenn du willst. Der Punkt hier ist, dass Sie die Mitte Ihrer UIView auf dem Textfeld festlegen möchten, das Sie bearbeiten.
Zuvor müssen Sie Ihr INITIAL_CENTER als CGPoint aus self.view.center und Ihr INITIAL_VIEW als CGRect aus self.view.frame in einer const-Eigenschaft speichern.
Sie können eine Methode wie folgt erstellen:
Dann auf Ihrem UITextFieldDelegate , müssen Sie rufen centerOn: (CGRect) in folgenden Methoden:
textFieldDidBeginEditing: (UITextField *) mit als Parameter dem Rahmen des Textfelds, auf das Sie sich konzentrieren möchten.
Und Sie müssen es in Ihrem Event-Handler aufrufen, wo Sie Ihre Tastatur schließen,
textFieldDidEndEditing: (UITextField *) kann eine der Möglichkeiten sein, dies zu tun, indem INITIAL_VIEW als Parameter von centerOn: (CGRect) verwendet wird .
quelle
Ich glaube, dass bei neueren Versionen von iOS (6.1+, möglicherweise sogar früher) die zugrunde liegende Ansicht, zumindest für UITableView, automatisch verkleinert wird, wenn die Tastatur angezeigt wird. Sie müssen also nur das Textfeld in dieser Ansicht sichtbar machen. In
init
:dann:
quelle
https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Ich hoffe, diese Lösung hat geholfen. Sie sind alle Swift 3 geschrieben.
quelle