web-dev-qa-db-de.com

Entlassen der Tastatur in einer UIScrollView

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.

57
Nicholas1024

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
129
Pei

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];
}
51
Zhang

Obwohl die Essenz gleich ist, bevorzuge ich weniger Code.

Festlegen, dass die Tastatur ausgeblendet wird, wenn die Bildlaufansicht im Attribut-Inspektor gescrollt wird:

make keyboard disappear when scrollView is scrolled

Verschwinde dann die Tastatur, wenn auf scrollView geklickt wird:

  1. Ziehen Sie einen Tap-Gesten-Erkenner auf Ihr ScrollView
  2. Ctrl-Drag
  3. Make an action
  4. Nur eine Zeile in der Aktion —— scrollView.endEditing(true). Wenn Sie Objective-C verwenden, [self.scrollView endEditing: YES];
33
fujianjin6471

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()
    }
}
10
King-Wizard

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.

Schnelle Version

vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
5
Naresh Reddy M

Versuche dies

[self.selectedViewController.view endEditing:YES];

4
Saad Ur Rehman

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()

}
3
chandra1234

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)
}
2
Jorge Casariego

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
2
Skotch
    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
        }
    }
}
0
jethava yogesh
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
0
vignesh.P

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
}
0
user1140780