Отключение клавиатуры в UIScrollView
Хорошо, у меня есть пара UITextFields
и UITextViews
внутри UIScrollView
, и я бы хотел, чтобы клавиатура исчезла всякий раз, когда коснется или прокручивается scrollview
(за исключением случаев, когда вы касаетесь внутрь текстовое поле/представление, конечно).
Моя текущая попытка сделать это заменяет UIScrollView
на подкласс и устанавливает его для вызова функции removeKeyboard (определенной внутри главного контроллера представления) внутри метода touchhesBegan. Однако это только удаляет клавиатуру для нормального касания, а не когда просмотр просто прокручивается. Итак, что лучший способ удалить клавиатуру внутри UIScrollView
?
Заранее благодарим за помощь.
Ответы
Ответ 1
Вот самый чистый способ добиться этого в iOS 7.0 и выше.
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Или же
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Swift:
scrollView.keyboardDismissMode = .onDrag
Или же
scrollView.keyboardDismissMode = .interactive
Ответ 2
Бит поздно, но если кто-то еще ищет ответ на эту проблему, вот как я решил его решить:
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];
}
Ответ 3
Хотя суть та же, я предпочитаю меньше кода.
Установка клавиатуры исчезнет при прокрутке scrollView в инспекторе атрибутов:
![make keyboard disappear when scrollView is scrolled]()
Затем исчезает клавиатура при нажатии scrollView:
- Перетащите указатель жесты касания на свой scrollView
-
![Ctrl-Drag]()
-
![Make an action]()
- Только одна строка в действии -
scrollView.endEditing(true)
. Если вы используете Objective-C, [self.scrollView endEditing: YES];
Ответ 4
В 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()
}
}
Ответ 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.
Swift Version
vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
Ответ 6
Попробуйте это
[self.selectedViewController.view endEditing:YES]
;
Ответ 7
Когда я добавил жест к подклассу 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
Ответ 8
Немного поздно, но если кто-то еще ищет ответ на эту проблему с помощью Swift 3:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
view.endEditing(true)
}
Ответ 9
Создайте класс расширения для сокрытия клавиатуры при касании прокрутки/просмотра в любом месте
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()
}
Ответ 10
Попробуйте этот метод представления делегата прокрутки -
свяжите делегата в 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
}
Ответ 11
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Ответ 12
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
}
}
}