Okay, ich habe ein paar von UITextFields
und UITextViews
in einer UIScrollView
, und ich möchte die Tastatur so einstellen, dass sie immer verschwindet, wenn die scrollview
berührt oder gescrollt wird (außer wenn Sie innerhalb des Textfelds/der Ansicht berühren).
Mein aktueller Versuch dazu ist, die Variable UIScrollView
durch eine Unterklasse zu ersetzen und sie so einzustellen, dass eine removeKeyboard-Funktion (innerhalb des Hauptansicht-Controllers definiert) innerhalb der touchesBegan -Methode aufgerufen wird. Dies entfernt jedoch nur die Tastatur für eine normale Berührung, nicht wenn die Ansicht einfach gescrollt wird. Was ist also der beste Weg, um die Tastatur in einer UIScrollView
zu entfernen?
Vielen Dank im Voraus für Ihre Hilfe.
Dies ist der sauberste Weg, um dies in iOS 7.0 und höher zu erreichen.
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Oder
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Schnell:
scrollView.keyboardDismissMode = .onDrag
Oder
scrollView.keyboardDismissMode = .interactive
Etwas spät, aber wenn noch jemand nach einer Antwort auf dieses Problem sucht, habe ich das Problem gelöst:
1) Erstellen Sie eine Berührungsgestenerkennung mit einer Ziel-Callback-Methode, um Ihre Tastatur mit resignFirstResponder für alle Felder zu schließen.
2) Fügen Sie die Tap-Geste der Bildlaufansicht hinzu.
Hier ist ein Beispiel:
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;
[pageScrollView addGestureRecognizer:tapGesture];
[tapGesture release];
...
// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
[myTextFieldInScrollView resignFirstResponder];
}
Obwohl die Essenz gleich ist, bevorzuge ich weniger Code.
Festlegen, dass die Tastatur ausgeblendet wird, wenn die Bildlaufansicht im Attribut-Inspektor gescrollt wird:
Verschwinde dann die Tastatur, wenn auf scrollView geklickt wird:
scrollView.endEditing(true)
. Wenn Sie Objective-C verwenden, [self.scrollView endEditing: YES];
In Swift :
Etwas spät, aber wenn noch jemand nach einer Antwort auf dieses Problem sucht, habe ich das Problem gelöst:
1) Erstellen Sie eine Berührungsgestenerkennung mit einer Ziel-Callback-Methode, um Ihre Tastatur mit resignFirstResponder für alle Felder zu schließen.
2) Fügen Sie die Tap-Geste der Bildlaufansicht hinzu.
Hier ist ein Beispiel:
import UIKit
class ViewController: UIViewController {
@IBOutlet var t1: UITextField!
@IBOutlet var t2: UITextField!
@IBOutlet var t3: UITextField!
@IBOutlet var t4: UITextField!
@IBOutlet var srcScrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard")
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = false
srcScrollView.addGestureRecognizer(tapGesture)
}
func hideKeyboard() {
t1.resignFirstResponder()
t2.resignFirstResponder()
t3.resignFirstResponder()
t4.resignFirstResponder()
}
}
Schauen Sie sich die Datei keyboardDismissMode von UIScrollView an.
// will hide keyboard when your text field is about to go beyond the keyboard.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
// will hide keyboard instantly once the scroll view started scrolling by user.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissOnDrag;
// If you need to hide keyboard on tap of scroll view,consider adding a tap gesture or sub class and override touchesbegan: method.
vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
Versuche dies
[self.selectedViewController.view endEditing:YES]
;
Erstellen Sie eine Erweiterungsklasse zum Ausblenden der Tastatur, wenn Sie die Bildlaufansicht/-ansicht an einer beliebigen Stelle berühren
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
Und rufen Sie diese Methode gerne in viewDidLoad auf
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Ein bisschen spät, aber wenn noch jemand nach einer Antwort auf dieses Problem sucht, mit Swift 3 :
func scrollViewDidScroll(_ scrollView: UIScrollView) {
view.endEditing(true)
}
Als ich die Geste zu einer Unterklasse von UIScrollView
hinzufügte, hatte ich Probleme mit den verschiedenen Gesten in meinem Ansichtsbaum, die sich gegenseitig störten, z. B. Unteransichten anklicken, die Ansicht scrollen und die Tastatur in allen Fällen verwerfen zu lassen. Ich habe mir diese Lösung ausgedacht, die aus einer Superklasse von UIScrollView
oder von einer UIViewController
eingerichtet werden kann.
Die DismissKeyboardTapGesture
-Klasse verwendet ARC, arbeitet mit beliebigen Textfeldern unter der Ansicht und übernimmt keine Klicks von Unteransichten wie Schaltflächen. Nutzt auch den Scrolleffekt von iOS7, um die Tastatur zu schließen.
Einrichten von UISScrollView Superklasse:
_dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self];
oder von UIViewController:
_dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self.view];
Hier ist die Klasse:
@interface DismissKeyboardTapGesture : NSObject <UIGestureRecognizerDelegate>
@end
@implementation DismissKeyboardTapGesture
- (id)initWithView:(UIView *)view
{
self = [super init];
if (self) {
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTap.cancelsTouchesInView = NO;
singleTap.delegate = self;
[view addGestureRecognizer:singleTap];
if ([view respondsToSelector:@selector(setKeyboardDismissMode:)]) {
// Bonus effect to dismiss keyboard by scrolling
((UIScrollView *)view).keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
}
}
return self;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Don't stop any existing gestures in our view from working
if (otherGestureRecognizer.view == gestureRecognizer.view) {
return YES;
}
return NO;
}
- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer
{
// Close keyboard for any text edit views that are children of the main view
[gestureRecognizer.view endEditing:YES];
}
@end
extension UIView{
//Set tag via storyboard
func keyboardDissmissInteractiveMode(_ tag:Int){
if let scrollView = self.viewWithTag(tag) as? UIScrollView{
scrollView.keyboardDismissMode = .interactive
}
if let tableview = self.viewWithTag(tag) as? UITableView{
tableview.keyboardDismissMode = .interactive
}
}
func keyboardDissmissOnDragMode(_ tag:Int){
if let scrollView = self.viewWithTag(tag) as? UIScrollView{
scrollView.keyboardDismissMode = .onDrag
}
if let tableview = self.viewWithTag(tag) as? UITableView{
tableview.keyboardDismissMode = .onDrag
}
}
func keyboardDissmissInteractiveMode(_ view:UIView){
if let scrollView = view as? UIScrollView{
scrollView.keyboardDismissMode = .interactive
}
if let tableview = view as? UITableView{
tableview.keyboardDismissMode = .interactive
}
}
func keyboardDissmissOnDragMode(_ view:UIView){
if let scrollView = view as? UIScrollView{
scrollView.keyboardDismissMode = .onDrag
}
if let tableview = view as? UITableView{
tableview.keyboardDismissMode = .onDrag
}
}
}
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Versuchen Sie diese Delegierungsmethode mit Scroll-Ansicht -
verknüpfen Sie den Delegierten in IB, um die Ansicht zu scrollen, und kopieren Sie dann diesen Code (ändern Sie ihn nach Bedarf).
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
//sample code
[challengeABallotComponent.voterNameTextField resignFirstResponder];
[challengeABallotComponent.ballotNumberTextField resignFirstResponder];
[locationInformation.pollingLocation resignFirstResponder];
}
Das sollte funktionieren. Sie können auch andere Delegatmethoden ausprobieren
-(void)scrollViewDidScroll: (UIScrollView *)scrollView
{
//do your stuff
}