bottom bar ios objective-c swift xamarin xamarin.ios

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