teclado tamaño principiantes para descargar cambiar aumentar ios iphone objective-c uitextfield first-responder

ios - tamaño - El teclado del iPad no se descartará si el estilo de presentación modal de ViewController es UIModalPresentationFormSheet



teclado iphone 7 (13)

Descubrí que disablesAutomaticKeyboardDismissal y agregar una función disablesAutomaticKeyboardDismissal no funcionaba para mi UITextField en un diálogo modal.

El teclado en pantalla simplemente no desaparecería.

Mi solución fue deshabilitar todos los controles de entrada de texto en mi diálogo y luego volver a habilitar los relevantes una fracción de segundo más tarde.

Parece que cuando iOS ve que ninguno de los controles de UITextField están habilitados, entonces se deshace del teclado.

Nota:

Vea la respuesta aceptada (no la más votada) para obtener una solución a partir de iOS 4.3.

Esta pregunta es sobre un comportamiento descubierto en el teclado del iPad, donde se niega a ser descartado si se muestra en un diálogo modal con un controlador de navegación.

Básicamente, si presento el controlador de navegación con la siguiente línea de la siguiente manera:

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

El teclado se niega a ser despedido. Si comento esta línea, el teclado se va bien.

...

Tengo dos campos de texto, nombre de usuario y contraseña; El nombre de usuario tiene un botón Siguiente y la contraseña tiene un botón Hecho. El teclado no desaparecerá si lo presento en un controlador de navegación modal.

TRABAJOS

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil]; [self.view addSubview:b.view];

NO FUNCIONA

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:b]; navigationController.modalPresentationStyle = UIModalPresentationFormSheet; navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:navigationController animated:YES]; [navigationController release]; [b release];

Si quito la parte del controlador de navegación y presento ''b'' como un controlador de vista modal por sí mismo, funciona. ¿El controlador de navegación es el problema?

TRABAJOS

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil]; b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:b animated:YES]; [b release];

TRABAJOS

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:b]; [self presentModalViewController:navigationController animated:YES]; [navigationController release]; [b release];


En el viewController que se presenta modalmente, solo sobrescribir deshabilitaAutomaticKeyboardDismissal para devolver siempre NO

- (BOOL)disablesAutomaticKeyboardDismissal { return NO; }


Esto ha sido clasificado como "trabajos según lo previsto" por los ingenieros de Apple. Presenté un error para esto hace un tiempo. Su razonamiento es que el usuario a menudo va a ingresar datos en forma modal, por lo que está tratando de ser "útil" y mantener el teclado visible donde normalmente varias transiciones dentro de la vista modal pueden hacer que el teclado se muestre / oculte repetidamente.

edición: aquí está la respuesta de un ingeniero de Apple en los foros de desarrolladores:

¿Se le presentó su opinión por casualidad con el estilo UIModalPresentationFormSheet? Para evitar animaciones frecuentes de entrada y salida, el teclado a veces permanece en la pantalla incluso cuando no hay un primer respondedor. Esto no es un error.

Esto está causando problemas a muchas personas (incluido yo mismo), pero en este momento no parece haber una manera de solucionarlo.

ACTUALIZAR:

En iOS 4.3 y versiones posteriores, ahora puede implementar `-disablesAutomaticKeyboardDismissal ''en su controlador de vista para devolver NO:

- (BOOL)disablesAutomaticKeyboardDismissal { return NO; }

Esto soluciona el problema.


Estoy seguro de que has mirado esto, pero estás seguro de que tu clase de controlador está conectada correctamente como el delegado de UITextField, ¿verdad?


Para aquellos que tienen problemas con UINavigationController, vea mi respuesta a una pregunta similar aquí: https://.com/a/10507689/321785

Edit: Considero que esto es una mejora de la solución de Miha Hribar (ya que la decisión se está llevando a cabo donde debería), y en oposición al comentario de Pascal sobre una categoría en UIViewController


Ponga este código en su viewWillDisappear: el método del controlador actual es otra forma de solucionar esto:

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl"); id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)]; [activeInstance performSelector:@selector(dismissKeyboard)];


Puede que no sea una solución perfecta, pero funciona
[self.view endEditing: YES];
Desde donde sea que esté implementado su botón o gesto para presentar modal.


Si cambia una pantalla modal diferente, puede hacer que el teclado desaparezca. No es bonito y no se anima, pero puedes hacer que desaparezca.

Sería genial si hubiera una solución, pero por ahora esto funciona. Puede UIViewController en una categoría en UIViewController y llamarlo cuando desee que se UIViewController el teclado:

@interface _TempUIVC : UIViewController @end @implementation _TempUIVC - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } @end @implementation UIViewController (Helpers) - (void)_dismissModalViewController { [self dismissModalViewControllerAnimated:NO]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil]; [self release]; } - (void)forceKeyboardDismissUsingModalToggle:(BOOL)animated { [self retain]; _TempUIVC *tuivc = [[_TempUIVC alloc] init]; tuivc.modalPresentationStyle = UIModalPresentationCurrentContext; [self presentModalViewController:tuivc animated:animated]; if (animated) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_dismissModalViewController) name:UIKeyboardDidHideNotification object:nil]; } else [self _dismissModalViewController]; [tuivc release]; } @end

Tenga cuidado con esto, sin embargo, mientras veDidAppear / viewDidDisappear y todos esos métodos son llamados. Como dije, no es bonito, pero funciona.

-Adán


También puede solucionar esto en una aplicación universal simplemente revisando el idioma y si es un iPad, no abra el teclado automáticamente y deje que el usuario toque lo que quiera editar.

Puede que no sea la mejor solución, pero es muy sencillo y no necesita hacks sofisticados que se romperán con la próxima gran versión de iOS :)


Tenga cuidado si está mostrando el modal con un UINavigationController . Luego, debe configurar la función disablesAutomaticKeyboardDismissal en el controlador de navegación y no en el controlador de vista. Puedes hacerlo fácilmente con categorías.

Archivo: UINavigationController + KeyboardDismiss.h

#import <Foundation/Foundation.h> @interface UINavigationController (KeyboardDismiss) - (BOOL)disablesAutomaticKeyboardDismissal; @end

Archivo: UINavigationController + KeyboardDismiss.m

#import "UINavigationController+KeyboardDismiss.h" @implementation UINavigationController(KeyboardDismiss) - (BOOL)disablesAutomaticKeyboardDismissal { return NO; } @end

No olvide importar la categoría en el archivo donde usa UINavigationController.


UIModalPresentationPageSheet esto usando el estilo de presentación UIModalPresentationPageSheet y UIModalPresentationPageSheet tamaño inmediatamente después de presentarlo. Al igual que:

viewController.modalPresentationStyle = UIModalPresentationPageSheet; viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:viewController animated:YES]; viewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; viewController.view.superview.frame = CGRectMake( viewController.view.superview.frame.origin.x, viewController.view.superview.frame.origin.y, 540.0f, 529.0f ); viewController.view.superview.center = self.view.center; [viewController release];


tal vez no devuelva NO, pero sí. Así puede irse.

¿Y también tiene un campo de textFieldShouldEndEditing que debe ser textFieldShouldEndEditing devuelto SÍ?

¿ Y por qué estás disparando [nextResponder becomeFirstResponder] ? lo siento ahora

También tengo un número de UITextViews que tienen su propiedad "editable" establecida en FALSE.

¿Podemos asumir que ninguno de ellos, por casualidad, tiene un valor de tag de secondField.tag+1 ? Si es así, les está diciendo que se conviertan en el primer respondedor, en lugar de renunciar al primer respondedor. Tal vez poner un poco de NSLog () en esa estructura si.


Swift 4.1: extension UINavigationController { override open var disablesAutomaticKeyboardDismissal: Bool { return false } }