volver - teclados para iphone 6
iPhone: haga que el teclado se deslice para verlo desde la derecha, como cuando se edita una nota en Contactos (5)
Para iOS 7, he encontrado que la siguiente solución funciona mejor para mí:
UIResponder-KeyboardCache
a su proyecto.
[UIResponder cacheKeyboard:YES];
al viewDidLoad
de la vista antes de la vista del teclado. Puede ser mejor hacer esto inmediatamente cuando se carga la aplicación o durante un tiempo conveniente cuando se lo puede permitir (durante una solicitud HTTP, por ejemplo). En la mayoría de los casos, simplemente en la vista anterior es suficiente.
-Agregue lo siguiente a viewDidLoad
de la vista de teclado.
dispatch_async(dispatch_get_main_queue(), ^{
[_textField becomeFirstResponder];
});
Para explicarlo, esto precargará la vista del teclado, lo que eliminará el retraso de la primera llamada de la vista del teclado. Al llamar a becomeFirstResponder
en el campo de texto en la cola principal, se desliza hacia adentro con la vista en lugar de animar hacia arriba antes de que la vista se deslice.
Estoy buscando una manera de deslizar el teclado en la vista desde la derecha, como lo que sucede en la aplicación Contactos cuando editas una nota.
Mi problema es que cuando llamo [someTextView BecomeFirstResponder] en viewWillAppear, el teclado aparece inmediatamente sin animación. Y cuando lo llamo en viewDidAppear, la vista primero se desliza desde la derecha (UINavigationController se desliza), y luego el teclado se desliza desde la parte inferior.
¿Es posible que el teclado se deslice desde la derecha, junto con la vista?
Solución
En iOS 7, funciona la función becomeFirstResponder
en _textView
en viewDidLayoutSubviews
.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[_textView becomeFirstResponder];
}
Nota: hacerlo en viewWillLayoutSubviews
también funciona.
Explicación
Lea la discusión en los documentos para becomeFirstResponder .
Puede llamar a este método para hacer que un objeto respondedor, como una vista, sea el primer respondedor. Sin embargo, solo debe llamarlo en esa vista si es parte de una jerarquía de vistas. Si la propiedad de
window
la vista contiene un objetoUIWindow
, se ha instalado en una jerarquía de vistas; si devuelvenil
, la vista se separa de cualquier jerarquía.
Cuando se usa un controlador de navegación para empujar su controlador de vista personalizado en pantalla, self.view.window
sigue siendo nil
en el momento en que se viewDidLoad
o viewWillAppear:
. Entonces, _textView.window
también es nil
en los mismos métodos, ya que _textView
es una subvista de self.view
, es decir, ambos están en la misma ventana. No importa cómo presente su controlador de vista personalizado, self.view.window
(y, por lo tanto, _textView.window
) también es nil
en initWithNibName:bundle:
self.view.window
se establece con el tiempo viewDidAppear:
se llama, pero eso es demasiado tarde porque en ese momento, el controlador de navegación ya ha completado la animación de empujar la vista en pantalla.
self.view.window
también se establece en el momento en que se llama viewWillLayoutSubviews
o viewDidLayoutSubviews
se llama a estos métodos antes de que comience la animación push del controlador de navegación. Entonces, es por eso que funciona cuando lo haces en cualquiera de esos métodos.
Desafortunadamente, las viewWillLayoutSubviews
viewDidLayoutSubviews
viewWillLayoutSubviews
y viewDidLayoutSubviews
viewWillLayoutSubviews
viewDidLayoutSubviews
se llaman mucho más que solo en el impulso inicial del controlador de navegación. Pero, navigationController:willShowViewController:
y willMoveToParentViewController:
recibir llamadas demasiado pronto (después de viewDidLoad
pero antes de que se configure self.view.window
) y navigationController:didShowViewController:
y didMoveToParentViewController:
ser llamado demasiado tarde (después de la animación).
La única otra manera en la que puedo pensar en hacerlo es observar de alguna manera la propiedad de la window
de _textView
para que se le notifique cuando cambie, pero no estoy seguro de cómo hacerlo ya que la window
es de readonly
.
En iOS 7 (o en cualquier versión anterior) puede hacer una cosa simple en loadView , viewDidLoad o viewWillAppear
[yourTextView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
En este caso, obtendrá una apariencia de izquierda a derecha del teclado alineado con el movimiento de empujar el controlador de vista.
Puede intentar enviar el mensaje BecomeFirstResponder al nuevo controlador de vista antes de insertarlo en la pila. Por ejemplo:
-(void)functionWhereYouPushTheNewViewController {
yourNewViewController *newVC = [[yourNewViewController alloc] init];
[newVC.yourTextView becomeFirstResponder];
[self.navigationController pushViewController:newVC animated:YES];
}
Sin embargo, descubrí que cambiar las animaciones en cosas como el teclado es bastante difícil, y si lees las Pautas de Interfaz Humana, Apple deja bastante claro que quieren que ciertas cosas actúen de cierta manera, todo el tiempo. Hay formas de cambiar el comportamiento de ciertas animaciones, pero a menudo involucran llamadas de API no documentadas y son motivo de rechazo de la tienda de aplicaciones. Sería una violación de HIG el hecho de haber empujado las vistas hacia arriba desde la parte inferior, por ejemplo.
Espero que esto ayude.
Todo lo que necesita hacer es indicar a la vista de texto en cuestión que se convierta en el primer respondedor en el método viewDidLoad
del controlador de vista que está presionando en la pila de navegación:
override func viewDidLoad() {
super.viewDidLoad()
someTextView.becomeFirstResponder()
}
Esto funciona en iOS 8. El teclado se desliza desde la derecha junto con la vista.