Ich frage mich, wie ich die Tastatur verschwinden lassen kann, wenn der Benutzer außerhalb von a berührt UITextField
.
ios
cocoa-touch
uitextfield
uikit
jonepatr
quelle
quelle
Antworten:
Sie müssen ein hinzufügen
UITapGestureRecogniser
und es der Ansicht zuweisen und dann den Rücktritts-Ersthelfer auf demUITextField
Selektor anrufen .Der Code:
In viewDidLoad
In entlassenKeyboard:
(Wo
aTextField
ist das Textfeld, das für die Tastatur verantwortlich ist?)Swift 3 Version sieht so aus
Für entlassenKeyboard
quelle
[aTextField resignFirstResponder]
wäre,[self.view endEditing:YES];
brauche ich keinen Verweis auf das Textfeld und werde für mehrere Textfelder funktionieren[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
per @qiaoyis Antwort hinzugefügt ; Ich hatte ein Problem mit einer Tabelle, die nicht auf die Zeilenauswahl reagierte. 5 Jahre später hoffe ich, dass dies jemand anderem hilft.self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Ich habe ein paar Antworten zusammengestellt.
Verwenden Sie einen Ivar, der während initialisiert wird
viewDidLoad:
Verwerfen Sie, was gerade bearbeitet wird:
quelle
Überprüfen Sie dies, dies wäre der einfachste Weg, dies zu tun.
Oder
Diese Bibliothek übernimmt das automatische Scrollen in der Bildlaufleiste, das Tippen auf eine Leertaste, um die Tastatur auszublenden usw.
https://github.com/michaeltyson/TPKeyboardAvoiding
quelle
Ich sehe, dass einige Leute Probleme mit der
UITapGestureRecognizer
Methode haben. Der einfachste Weg, diese Funktionalität zu erreichen, während das Tippverhalten meiner vorhandenen Schaltfläche erhalten bleibt, besteht darin, der Antwort von @ Jensen2k nur eine Zeile hinzuzufügen:Dadurch konnten meine vorhandenen Schaltflächen weiterhin ohne die Methode von @Dmitry Sitnikov verwendet werden.
Lesen Sie dazu
property
hier (suchen Sie nachCancelsTouchesInView
): UIGestureRecognizer Class ReferenceIch bin mir nicht sicher, wie es mit Bildlaufleisten funktionieren würde, da ich sehe, dass einige Probleme damit hatten, aber hoffentlich könnte jemand anderes auf dasselbe Szenario stoßen, das ich hatte.
quelle
UIImageView
, hinzufügen[imageView setUserInteractionEnabled:NO];
und Sie es "durchklicken", wodurch diese Methode funktioniert.Es ist besser,
UIView
eine Instanz vonUIControl
(im Interface Builder) zu erstellen und dann derenTouchUpInside
Ereignis mit derdismissKeyboard
Methode zu verbinden. DieseIBAction
Methode sieht folgendermaßen aus:quelle
UITapGestureRecognizer
Beeinträchtigt das Tippen auf Schaltflächen in der Ansicht).touchesEnded
hat nicht funktioniert, weil es einUIScrollView
Durcheinander mit der Responderkette gab.)Swift 4
Richten Sie Ihre
UIViewController
mit dieser Erweiterung Methode einmal zB inviewDidLoad
:und die Tastatur wird auch durch Tippen auf die Tastatur geschlossen
NavigationBar
.quelle
Schnelle Version, dies funktioniert in Kombination mit anderen Elementen (wie dem einen
UIButton
oder anderenUITextField
):quelle
self
eher sein alsself.view
canclesTouchesInView
ist eine praktische Eigenschaft zu verwenden. Vielen Dank.c#
. Zu Ihrer Information: Dieses Semikolon ist syntaxfähig, es ist einfach nicht notwendig.Wie wäre es damit: Ich weiß, dass dies ein alter Beitrag ist. Es könnte jemandem helfen :)
quelle
Dies ist eine gute generische Lösung:
Ziel c:
Schnell:
Basierend auf der @ icodebuster-Lösung: https://stackoverflow.com/a/18756253/417652
quelle
Swift 4 Oneliner
quelle
Ich denke, der einfachste (und beste) Weg, dies zu tun, besteht darin, Ihre globale Ansicht zu unterordnen und die
hitTest:withEvent
Methode zu verwenden, um jede Berührung anzuhören. Berührungen auf der Tastatur sind nicht registriert, daher wird hitTest: withEvent nur aufgerufen, wenn Sie irgendwo anders berühren / scrollen / wischen / kneifen ... und dann anrufen[self endEditing:YES]
.Dies ist besser als die Verwendung,
touchesBegan
da sietouchesBegan
nicht aufgerufen werden, wenn Sie auf eine Schaltfläche oben in der Ansicht klicken. Es ist besser alsUITapGestureRecognizer
das, was zum Beispiel eine Bildlaufgeste nicht erkennen kann. Es ist auch besser als die Verwendung eines dunklen Bildschirms, da Sie in einer komplexen und dynamischen Benutzeroberfläche nicht überall einen dunklen Bildschirm platzieren können. Darüber hinaus werden andere Aktionen nicht blockiert. Sie müssen nicht zweimal auf tippen, um eine Schaltfläche außerhalb auszuwählen (wie im Fall von aUIPopover
).Es ist auch besser als anzurufen
[textField resignFirstResponder]
, da möglicherweise viele Textfelder auf dem Bildschirm angezeigt werden, sodass dies für alle funktioniert.quelle
Dies muss der einfachste Weg sein, Ihre Tastatur durch Berühren der Außenseite auszublenden:
(von So schließen Sie die Tastatur, wenn der Benutzer auf einen anderen Bereich außerhalb des Textfelds tippt. )
quelle
Wenn die Ansicht überhaupt in a eingebettet ist
UIScrollView
, können Sie Folgendes verwenden:Ersteres animiert die Tastatur außerhalb des Bildschirms, wenn die Tabellenansicht gescrollt wird, und letzteres versteckt die Tastatur wie die Standardnachrichten-App.
quelle
Sie können dies mit dem Storyboard in XCode 6 und höher tun:
Erstellen Sie die Aktion, um die Tastatur auszublenden
Fügen Sie dies der Header-Datei der von Ihrem ViewController verwendeten Klasse hinzu:
Fügen Sie dies dann der Implementierungsdatei desselben ViewControllers hinzu:
Dies ist nun eine der "empfangenen Aktionen" für Ihre Storyboard-Szene (dh ViewController):
Verbinden Sie die Aktion mit dem Benutzerereignis
Jetzt müssen Sie diese Aktion mit der Benutzergeste zum Berühren der Tastatur verbinden.
Wichtig - Sie müssen das in Ihrem Storyboard enthaltene "UIView" in ein UIControl konvertieren , damit es Ereignisse empfangen kann. Wählen Sie die Ansicht aus Ihrer View Controller-Szenenhierarchie aus:
... und ändere seine Klasse:
Ziehen Sie nun aus dem kleinen Kreis neben der "empfangenen Aktion" für Ihre Szene auf einen "leeren" Teil Ihrer Szene (tatsächlich ziehen Sie die "empfangene Aktion" auf das UIControl). Es wird eine Auswahl von Ereignissen angezeigt, an die Sie Ihre Aktion anschließen können:
Wählen Sie die Option "Innen nachbessern". Sie haben jetzt die von Ihnen erstellte IBAction mit einer Benutzeraktion zum Berühren der Tastatur verknüpft. Wenn der Benutzer auf die Tastatur tippt, wird sie jetzt ausgeblendet.
(HINWEIS: Um die Aktion mit dem Ereignis zu verknüpfen, können Sie die empfangene Aktion auch direkt auf das UIControl in Ihrer View Controller-Hierarchie ziehen. Sie wird in der Hierarchie als 'Control' angezeigt.)
quelle
Wenn ich Sie richtig verstanden habe, möchten Sie auf die Tastatur verzichten,
textfield
während Sie auf outSide of tippen, aber Sie haben keine Referenz von Ihrertextfield
.Versuche dies;
reftextField
Jetzt im
textFieldDidBeginEditing
eingestellten Textfeld auf setzenJetzt können Sie jede Tastenuhr problemlos verwenden (Hinzufügen einer transparenten Schaltfläche, wenn Sie mit der Bearbeitung beginnen, wird empfohlen).
Oder versuchen Sie dies, um die Schaltfläche "Fertig" zu beenden.
quelle
Nur um der Liste hier meine Version hinzuzufügen, wie man eine Tastatur bei Berührung von außen schließt.
viewDidLoad:
Irgendwo:
quelle
Hier gibt es
UITapGestureRecognizer
viele gute Antworten zur Verwendung von - alle davon sind dieUITextField
Clear (X) -Taste von break . Die Lösung besteht darin, den Gestenerkenner über seinen Delegaten zu unterdrücken:Es ist nicht die robusteste Lösung, aber es funktioniert für mich.
quelle
return !touchViewIsButton
. Ich denke, alle anderen Tasten, die die Tastatur schließen müssen, sollten dies in ihren Aktionen tun. Außerdem wird TouchUpInside möglicherweise nicht aufgerufen, wenn sich das Layout beim Entlassen der Tastatur ändert.Sie können eine Kategorie für das UiView erstellen und das touchBegan-Meathod wie folgt überschreiben.
Es funktioniert gut für mich. Und es ist eine zentrale Lösung für dieses Problem.
quelle
Schnelle Version der Antwort von @ Jensen2k:
Einzeiler
quelle
Ich habe Barry Beispiel für meine neue Entwicklung verwendet. Es hat super funktioniert! aber ich musste eine kleine Änderung hinzufügen, die erforderlich war, um die Tastatur nur für das zu bearbeitende Textfeld zu schließen.
Also habe ich dem Barry-Beispiel Folgendes hinzugefügt:
Außerdem habe ich die hideKeyboard-Methode wie folgt geändert:
quelle
Eine der einfachsten und kürzesten Möglichkeiten besteht darin, diesen Code zu Ihrem Code hinzuzufügen
viewDidLoad
quelle
quelle
Ich habe viele der Antworten hier ausprobiert und hatte kein Glück. Mein Tippgestenerkenner hat immer dazu geführt, dass ich
UIButtons
beim Tippen nicht reagiert habe, selbst wenn ich den eingestellt habecancelsTouchesInView
Eigenschaft des Gestenerkenners auf NEIN gesetzt habe.Dies ist, was schließlich das Problem gelöst hat:
Habe einen Ivar:
Wenn ein Textfeld bearbeitet wird, stellen Sie die Gestenerkennung ein:
Dann liegt der Trick darin, wie Sie die
dismissKeyboard
Methode einrichten :Ich denke, es geht nur darum, die
dismissKeyboardSelector
Ausführung aus dem Touch-Handling-Ausführungsstapel herauszuholen ...quelle
Senden Sie eine Nachricht
resignFirstResponder
an die Textdatei, die sie dort abgelegt hat. Weitere Informationen finden Sie in diesem Beitrag .quelle
Das funktioniert
In diesem Beispiel ist aTextField das einzige UITextField .... Wenn es andere oder UITextViews gibt, gibt es ein kleines bisschen mehr zu tun.
quelle
quelle
Fügen Sie diesen Code in Ihre ViewController.m- Datei ein:
quelle
In diesem Fall kann ScrollView verwendet und
TextField
in ScrollView hinzugefügt werden. Ich möchte Tippen Sie aufScrollView
und Anzeigen und dann auf Tastatur. Ich habe versucht, für alle Fälle Beispielcode zu erstellen. So was,Ihr Storyboard Sehen Sie sich das genau so an.
quelle
Sie können die UITapGestureRecongnizer-Methode zum Schließen der Tastatur verwenden, indem Sie außerhalb von UITextField klicken. Wenn Sie diese Methode verwenden, wird die Tastatur geschlossen, wenn der Benutzer außerhalb von UITextField klickt. Unten finden Sie das Code-Snippet für die Verwendung.
quelle
Festgelegte Textfelder, die in der Ansicht delegiert wurden, wurden geladen:
Fügen Sie diese Funktion hinzu:
quelle