when objective appears ios objective-c swift uiscrollview keyboard

ios - objective - Descartar el teclado en UIScrollView



scrollview swift (10)

De acuerdo, tengo un par de UITextFields y UITextViews dentro de UIScrollView , y me gustaría configurar el teclado para que desaparezca cada scrollview se toca o se desplaza la vista de desplazamiento (excepto cuando se toca dentro del campo / vista de texto, por supuesto).

Mi intento actual de hacer esto es reemplazar el UIScrollView con una subclase y configurarlo para invocar una función removeKeyboard (definida dentro del controlador de vista principal) dentro del método touchesBegan . Sin embargo, esto solo elimina el teclado para un toque normal, no cuando la vista simplemente se desplaza. Entonces, ¿cuál es la mejor manera de quitar el teclado dentro de UIScrollView ?

Gracias de antemano por tu ayuda.


Esta es la forma más limpia de lograr esto en iOS 7.0.

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

O

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Rápido:

scrollView.keyboardDismissMode = .onDrag

O

scrollView.keyboardDismissMode = .interactive


Un poco tarde, pero si alguien más está buscando una respuesta a este problema, así es como lo resolví:

1) Cree un reconocedor de gestos de toque con un método de devolución de llamada de destino para descartar su teclado usando resignFirstResponder en todos sus campos.

2) Agregue el gesto de toque a la vista de desplazamiento.

Aquí hay un ejemplo:

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


Cuando agregué el gesto a una subclase de UIScrollView , estaba teniendo problemas con los diversos gestos en mi árbol de vista que interferían entre sí, como poder hacer clic en las subvistas, desplazar la vista y hacer que el teclado se descartara en todos los casos. Se me ocurrió esta solución, que se puede configurar desde una superclase de UIScrollView o desde un UIViewController .

La clase DismissKeyboardTapGesture utiliza ARC, funciona con cualquier campo de texto debajo de la vista y no reemplaza los clics de las subvistas como los botones. También aprovecha el efecto de desplazamiento iOS7 para descartar el teclado.

Configuración desde la superclase UISScrollView:

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

o desde UIViewController:

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

Aquí está la clase:

@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


En Swift :

Un poco tarde, pero si alguien más está buscando una respuesta a este problema, así es como lo resolví:

1) Cree un reconocedor de gestos de toque con un método de devolución de llamada de destino para descartar su teclado usando resignFirstResponder en todos sus campos.

2) Agregue el gesto de toque a la vista de desplazamiento.

Aquí hay un ejemplo:

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


Aunque la esencia es la misma, prefiero menos código.

Configurar el teclado para que desaparezca cuando scrollView se desplaza en el inspector de atributos:

Luego, desaparece el teclado cuando se toca scrollView:

  1. Arrastra un Tap Recognure Recognizer a tu scrollView
  2. Solo una línea en la acción - scrollView.endEditing(true) . Si está utilizando Objective-C, [self.scrollView endEditing: YES];

Un poco tarde, pero si alguien más busca una respuesta a este problema con Swift 3 :

func scrollViewDidScroll(_ scrollView: UIScrollView) { view.endEditing(true) }


Pruebe este método delegado de vista de desplazamiento -

enlace delegado en IB para desplazar la vista y luego copiar este código (modificar según su necesidad).

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

Esto debería funcionar. Puede probar otros métodos de delegado también, como

-(void)scrollViewDidScroll: (UIScrollView *)scrollView { //do your stuff }


Prueba esto

[self.selectedViewController.view endEditing:YES] ;


Observe el modo de descarte del teclado de la propiedad 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.

¡Feliz de ayudar!


scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;