Отключение клавиатуры в UIScrollView

ios objective-c swift uiscrollview keyboard

42416 просмотра

11 ответа

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

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

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

Автор: Nicholas1024 Источник Размещён: 17.05.2019 03:45

Ответы (11)


128 плюса

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

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Или же

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Swift:

scrollView.keyboardDismissMode = .onDrag

Или же

scrollView.keyboardDismissMode = .interactive
Автор: Pei Размещён: 18.11.2013 03:11

51 плюса

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

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

2) Добавьте жестов tap в scrollview.

Вот пример:

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];
}
Автор: Zhang Размещён: 22.06.2012 03:11

33 плюса

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

Установка клавиатуры исчезает при прокрутке scrollView в инспекторе Attributes:

заставить клавиатуру исчезать при прокрутке scrollView

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

  1. Перетащите указатель жесты касания на свой scrollView
  2. Ctrl-Drag
  3. Сделайте акцию
  4. Только одна строка в действии - scrollView.endEditing(true). Если вы используете Objective-C,[self.scrollView endEditing: YES];
Автор: fujianjin6471 Размещён: 25.03.2015 03:29

10 плюса

В Свифт :

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

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

2) Добавьте жестов tap в scrollview.

Вот пример:

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()
    }
}
Автор: King-Wizard Размещён: 06.12.2014 03:37

5 плюса

Посмотрите на свойство 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.

Быстрая версия

vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
Автор: Naresh Reddy M Размещён: 23.09.2016 03:02

4 плюса

Попробуй это

[self.selectedViewController.view endEditing:YES];

Автор: Saad Ur Rehman Размещён: 22.07.2013 11:02

3 плюса

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

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

}
Автор: chandra1234 Размещён: 14.05.2018 05:41

2 плюса

Когда я добавил жест к подклассу UIScrollView, у меня возникли проблемы с различными жестами в дереве моего представления, мешающими друг другу, например, возможность щелкнуть на subviews, прокрутить представление и отключить клавиатуру во всех случаях. Я придумал это решение, которое можно настроить из суперкласса UIScrollViewили из a 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
Автор: Skotch Размещён: 01.11.2013 08:01

2 плюса

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

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    view.endEditing(true)
}
Автор: Jorge Casariego Размещён: 23.09.2016 02:28

0 плюса

Попробуйте этот метод просмотра делегата прокрутки -

связать делегата в IB, чтобы прокрутить представление, а затем скопировать этот код (изменить в соответствии с вашими потребностями).

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{         
//sample code    
    [challengeABallotComponent.voterNameTextField resignFirstResponder];
    [challengeABallotComponent.ballotNumberTextField resignFirstResponder];
    [locationInformation.pollingLocation resignFirstResponder];
}

Это должно сработать. Вы также можете попробовать другие методы делегата

   -(void)scrollViewDidScroll: (UIScrollView *)scrollView 
{
//do your stuff
}
Автор: user1140780 Размещён: 11.09.2012 05:21

0 плюса

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Автор: vignesh.P Размещён: 16.10.2017 07:23
Вопросы из категории :
32x32