ios - bottom - status bar iphone
¿Cómo desenfoco UITextFields cuando el usuario presiona otros controles/espacio en blanco? (6)
Tengo un UITextField
. Funciona normalmente, lo que significa que cuando se presiona, se dispara el método EditingDidBegin
, etc. El problema es que no puedo anular la selección, lo que significa que el teclado siempre estará visible, cubriendo controles importantes. Pensé que el comportamiento predeterminado sería anular la selección / ocultar el teclado cuando el usuario hace clic en un lugar diferente al UITextField
, por ejemplo, en el espacio vacío a su alrededor, pero no es así: el UITextField
todavía está allí. Una opción para lograr este comportamiento sería agregar touch listener a todo lo que no sea UITextFields
y realizar un desenfoque manual cuando se active, pero esa sería una solución terrible por razones obvias.
La pregunta es, ¿cómo desenfoco
UITextFields
cuando el usuario presiona otros controles / "espacio en blanco"?
Las opciones propuestas no funcionan para Xamarin.iOS, que es lo que necesito.
Puedes usar esto
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
Renombrará su textField o textView tocando fuera de él.
Nota: No afectará a scrollView
C objetivo
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
En la vista de desplazamiento
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;
[yourScrollView/TableView addGestureRecognizer:tapGesture];
// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
[textFieldInYourScrollView/TableView resignFirstResponder];
}
Siempre agrego esto a mi ViewController
override func viewDidLoad()
{
super.viewDidLoad()
// other stuff
// but to stop editing when the user taps anywhere on the view, add this gesture recogniser
let tapGestureBackground = UITapGestureRecognizer(target: self, action: #selector(self.backgroundTapped(_:)))
self.view.addGestureRecognizer(tapGestureBackground)
}
func backgroundTapped(_ sender: UITapGestureRecognizer)
{
self.endEditing(true)
}
¿Qué resignFirstResponder
cuando resignFirstResponder
resignFirstResponder de resignFirstResponder
cuando queremos desenfocarlo? ¡Esa es la solución que estamos usando en muchas aplicaciones!
Puede lograr esto usando UIGestureRecognizerDelegate
.
Cree el objeto UITapGestureRecognizer
y agréguelo a la vista del controlador. Escriba el código siguiente en el método viewDidLoad
- (void) viewDidLoad {
[super viewDidLoad];
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] init];
tapRecognizer.delegate = self;
[self.view addGestureRecognizer:tapRecognizer];
}
No olvide UIGestureRecognizerDelegate
su controlador con UIGestureRecognizerDelegate
.
@interface YourViewController () <UIGestureRecognizerDelegate>
@property (nonatomic, weak) IBOutlet UITextField *textField;
@end
Ahora implemente el método de delegado - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
es un método delegado de UITapGestureRecognizer
.
En este método, simplemente puede verificar su textField (en este ejemplo, hemos utilizado self.textField
).
Y escriba una condición para resignFirstResponder
de su textField.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isEqual:self.textField]) {
return NO;
} else {
[self.textField resignFirstResponder];
return YES;
}
}
Si usa UITableViewCell, puede ocultar su teclado estableciendo una de estas propiedades de acuerdo con sus requisitos:
tableView.keyboardDismissMode = .onDrag
tableView.keyboardDismissMode = .interactive
Y si está utilizando la vista normal de UIViewController, simplemente puede agregar un UITAPGestureRecognizer en viewDidLoad (): -
let gesture = UITapGestureRecognizer()
gesture.addTarget(self, action: #selector(self.hideKeyBoard(sender:)))
Y defina su función de acción dentro de su UIViewController, así:
func hideKeyBoard(sender : UITapGestureRecognizer){
self.view.endEditing(true)
}
public class MyUIView : UIView
{
//ctor..
public override UIView HitTest(CGPoint point, UIEvent uievent)
{
var res = base.HitTest(point, uievent);
if (res == null || !(res.GetType().IsSubclassOf(typeof(UITextField)) || res.GetType() == typeof(UITextField)))
{
this.EndEditing(false);
}
return res;
}
}
en su ViewController
public override void LoadView()
{
View = new MyUIView();
}