Отклонение клавиатуры в UIScrollView - PullRequest
59 голосов
/ 28 февраля 2011

Хорошо, у меня есть пара UITextFields и UITextViews внутри UIScrollView, и я бы хотел, чтобы клавиатура исчезала при каждом касании или прокрутке scrollview (кроме случаев, когда вы касаетесь внутри текстовое поле / вид, конечно).

Моя текущая попытка сделать это - заменить UIScrollView подклассом и настроить его на вызов функции removeKeyboard (определенной в контроллере основного представления) внутри метода touchesBegan . Однако, это удаляет клавиатуру только для обычного прикосновения, а не тогда, когда вид просто прокручивается. Итак, каков наилучший способ удалить клавиатуру внутри UIScrollView?

Заранее спасибо за помощь.

Ответы [ 12 ]

131 голосов
/ 18 ноября 2013

Вот самый чистый способ добиться этого в iOS 7.0 и выше.

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Или

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Swift:

scrollView.keyboardDismissMode = .onDrag

Или

scrollView.keyboardDismissMode = .interactive
51 голосов
/ 22 июня 2012

Немного поздно, но если кто-то еще ищет ответ на эту проблему, вот как я решил ее:

1) Создайте распознаватель жестов касания с целевым методом обратного вызова, чтобы отклонить клавиатуру с помощью resignFirstResponder во всех ваших полях.

2) Добавьте жест касания к просмотру прокрутки.

Вот пример:

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];
}
34 голосов
/ 25 марта 2015

Хотя суть та же, я предпочитаю меньше кода.

Настройка исчезновения клавиатуры при прокрутке scrollView в Инспекторе атрибутов:

make keyboard disappear when scrollView is scrolled

Затем исчезните с клавиатуры при нажатии scrollView:

  1. Перетащите распознаватель жестов касанием на свой scrollView
  2. Ctrl-Drag
  3. Make an action
  4. одна строка в действии —— scrollView.endEditing(true).Если вы используете Objective-C, [self.scrollView endEditing: YES];
10 голосов
/ 06 декабря 2014

In Swift :

Немного поздно, но если кто-то еще ищет ответ на эту проблему, вот как я решил ее:

1) Создайте распознаватель жестов касания с целевым методом обратного вызова, чтобы отклонить клавиатуру, используя resignFirstResponder для всех ваших полей.

2) Добавьте жест касания к просмотру прокрутки.

Вот пример:

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()
    }
}
6 голосов
/ 23 сентября 2016

Посмотрите на keyboardDismissMode свойство UIScrollView.

// 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.

Swift Version

vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
3 голосов
/ 22 июля 2013

Попробуйте

[self.selectedViewController.view endEditing:YES];

2 голосов
/ 14 мая 2018

Создание класса расширения для сокрытия клавиатуры при касании прокрутки / просмотра в любом месте

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

}

И вызовите этот метод в viewDidLoad как

 override func viewDidLoad() {
    super.viewDidLoad()

    self.hideKeyboardWhenTappedAround()

}
2 голосов
/ 23 сентября 2016

Немного поздно, но если кто-то еще ищет ответ на эту проблему с помощью Swift 3 :

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    view.endEditing(true)
}
2 голосов
/ 02 ноября 2013

Когда я добавил жест к подклассу UIScrollView, у меня возникли проблемы с различными жестами в моем дереве представлений, которые мешают друг другу, такими как возможность щелкнуть по подпредставлениям, прокрутить представление и получить клавиатуру уволить во всех случаях. Я придумал это решение, которое можно настроить из суперкласса UIScrollView или из UIViewController.

Класс DismissKeyboardTapGesture использует ARC, работает с любыми текстовыми полями в представлении и не принимает клики из подпредставлений, таких как кнопки. Также использует эффект прокрутки iOS7, чтобы отклонить клавиатуру.

Настройка из суперкласса UISScrollView:

    _dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self];

или из UIViewController:

    _dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self.view];

Вот класс:

@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
0 голосов
/ 05 июля 2019
    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
        }
    }
}
...