tamaño - teclado iphone descargar
Alinear programáticamente una barra de herramientas sobre el teclado del iPhone (8)
En varios casos, deseo agregar una barra de herramientas en la parte superior del teclado del iPhone (como en iPhone Safari cuando navega elementos de formulario, por ejemplo).
Actualmente estoy especificando el rectángulo de la barra de herramientas con constantes pero debido a que otros elementos de la interfaz están en flujo -barras de herramientas y barras de navegación en la parte superior de la pantalla- cada vez que hacemos un cambio de interfaz menor, la barra de herramientas se desalinea.
¿Hay alguna manera de determinar programáticamente la posición del teclado en relación con la vista actual?
A partir de iOS 3.2 hay una nueva forma de lograr este efecto:
UITextFields
y UITextViews
tienen una propiedad inputAccessoryView
, que puede establecer en cualquier vista, que se muestra automáticamente arriba y animada con el teclado.
Tenga en cuenta que la vista que utiliza no debe estar en la jerarquía de vista en otro lugar, ni debe agregarla a alguna supervista, esto se hace por usted.
Así que básicamente:
En el método init:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];
Y luego tenga los métodos mencionados anteriormente para ajustar la posición de la barra:
-(void) keyboardWillShow:(NSNotification *) note
{
CGRect r = bar.frame, t;
[[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
r.origin.y -= t.size.height;
bar.frame = r;
}
Podría hacerlo bonito animando el cambio de posición envolviéndolo en
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
//...
[UIView commitAnimations];
Crea este método y llámalo en ViewWillLoad:
- (void) keyboardToolbarSetup
{
if(self.keyboardToolbar==nil)
{
self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)];
UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)];
NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil];
[self.keyboardToolbar setItems:toolbarButtons];
self.myTextView.inputAccessoryView=self.keyboardToolbar;
}
}
En 3.0 y más arriba, puede obtener la duración y la curva de la userInfo
diccionario userInfo
de las notificaciones.
por ejemplo, para animar el tamaño de la vista para dejar espacio para el teclado, regístrese para UIKeyboardWillShowNotification
y haga algo como lo siguiente:
- (void)keyboardWillShow:(NSNotification *)notification
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
[UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
CGRect frame = self.view.frame;
frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
self.view.frame = frame;
[UIView commitAnimations];
}
Haz una animación similar para UIKeyboardWillHideNotification
.
Esto se basa en la respuesta existente de tonklon : solo estoy agregando un fragmento de código que muestra una barra de herramientas negra semi transparente en la parte superior del teclado, junto con un botón "listo" a la derecha:
UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];
UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];
NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];
[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];
[aTextField setInputAccessoryView:toolbar];
y el -resignKeyboard
ve así:
-(void)resignKeyboard {
[aTextField resignFirstResponder];
}
Espero que ayude a alguien.
He encontrado que este enlace es muy útil para comprender paso a paso la vista inputaccesory.
No hay forma (AFAIK) de obtener las dimensiones de la vista del teclado. Sin embargo, es constante, al menos en todas las versiones de iPhone hasta ahora.
Si calcula la posición de la barra de herramientas como un desplazamiento desde la parte inferior de su vista, y toma en cuenta el tamaño de su vista, entonces no debería preocuparse si una barra de navegación está presente o no.
P.ej
#define KEYBOARD_HEIGHT 240 // example - can''t remember the exact size
#define TOOLBAR_HEIGHT 30
toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;
// move toolbar either directly or with an animation
En lugar de una definición, puede crear fácilmente una función keyboardHeight
que devuelve el tamaño en función de si se está mostrando el teclado, y mover esta posición de la barra de herramientas en una función separada que reorganice su diseño.
También puede depender de dónde haga este posicionamiento, ya que es posible que el tamaño de su vista cambie entre la carga y la que se muestra según la configuración de la barra de navegación. Creo que el mejor lugar para hacerlo sería ver aparecer.
Si se registra para notificaciones de teclado, es decir, UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
, etc., la notificación que reciba contendrá los límites del teclado en el dict de UIKeyboardBoundsUserInfoKey
( UIKeyboardBoundsUserInfoKey
).
Ver la referencia de la clase UIWindow
.