Uikeyboardwillshownotification & uikeyboarddidshownotification report de altura del teclado incorrecto
-
26-10-2019 - |
Pregunta
El siguiente código (perdón por la longitud) muestra un comportamiento impar en iOS 4.3 (tal vez la versión de otros también). En este ejemplo, hay tres UITextField
s que tienen tres teclados de diferentes tamaños. Si comienza a editar un campo de texto y luego toca "Return" que descarta el teclado, cada vez que el tamaño del teclado se devuelve correctamente en UIKeyboardWillShowNotification
y UIKeyboardDidShowNotification
usando UIKeyboardFrameBeginUserInfoKey
.
vea abajo:
- (void) keyboardWillShowNotification:(NSNotification *)aNotification
y
- (void) keyboardDidShowNotification:(NSNotification *)aNotification
Tenga en cuenta que este es el comportamiento esperado.
action reported keyboard size expected keyboard size
--------------------- ---------------------- ----------------------
touch one & return 100 100
touch two & return 200 200
touch normal & return 216 216
n & return keyboard size(n) keyboard size(n)
El comportamiento inesperado es si comienza a editar un campo de texto, el tamaño del primer teclado se informa (esperado). Cuando toca el segundo campo de texto (sin tocar la retorno), el tamaño del primer teclado se informa (inesperado) en lugar del tamaño del segundo. Cuando toca el tercer campo de texto (sin tocar la retorno), se informa el tamaño del segundo tamaño del teclado (inesperado) en lugar del tamaño del tercero. Durante el segundo o enésimo tiempo, parece que está informando el tamaño del teclado anterior, no el que se mostrará.
action reported keyboard size expected keyboard size
------------ ---------------------- ----------------------
touch one 100 100
touch two 100 200
touch normal 200 216
touch one 216 100
n keyboard size(n-1) keyboard size(n)
Antes de enviar un informe de errores, solo quiero asegurarme de no haber mirado demasiado.
FYI, me robé esto mientras intentaba hacer lo correcto (usando UIKeyboardWillShowNotification
o UIKeyboardDidShowNotification
y UIKeyboardFrameBeginUserInfoKey
Para obtener el tamaño del teclado) al cambiar una vista para que se haya oscurecido un campo de texto que hubiera sido oscurecido por un teclado. Referencia:
¿Cómo hacer que un UITextfield se mueva cuando está presente el teclado?
Bugvc.h
#import <UIKit/UIKit.h>
@interface BugVC : UIViewController <UITextFieldDelegate> {
UITextField *oneTF;
UITextField *twoTF;
UITextField *normalTF;
UILabel *keyboardWillShowNotificationL;
UILabel *keyboardDidShowNotificationL;
}
- (void) oneReturnTouchDown:(id)sender;
- (void) twoReturnTouchDown:(id)sneder;
- (void) keyboardWillShowNotification:(NSNotification *)aNotification;
- (void) keyboardDidShowNotification:(NSNotification *)aNotification;
@end
Bugvc.m
#import "BugVC.h"
@implementation BugVC
- (id) init
{
if ( !(self = [super init]) )
{
return self;
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// One text field with 100 height keyboard
oneTF = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 300, 30)];
oneTF.borderStyle = UITextBorderStyleRoundedRect;
oneTF.text = @"100";
oneTF.delegate = self;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Custom input view for the above text field
UIView *oneInputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
oneInputView.backgroundColor = [UIColor redColor];
UIButton *oneReturnB = [UIButton buttonWithType:UIButtonTypeRoundedRect];
oneReturnB.frame = CGRectMake(10, 10, 300, 30);
[oneReturnB setTitle:@"return" forState:UIControlStateNormal];
[oneReturnB addTarget:self
action:@selector(oneReturnTouchDown:)
forControlEvents:UIControlEventTouchDown];
[oneInputView addSubview:oneReturnB];
oneTF.inputView = oneInputView;
[oneInputView release];
[self.view addSubview:oneTF];
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// Two text field with 200 height keyboard
twoTF = [[UITextField alloc] initWithFrame:CGRectMake(10, 50, 300, 30)];
twoTF.borderStyle = UITextBorderStyleRoundedRect;
twoTF.text = @"200";
twoTF.delegate = self;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Custom input view for the above text field
UIView *twoInputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];
twoInputView.backgroundColor = [UIColor blueColor];
UIButton *twoReturnB = [UIButton buttonWithType:UIButtonTypeRoundedRect];
twoReturnB.frame = CGRectMake(10, 10, 300, 30);
[twoReturnB setTitle:@"return" forState:UIControlStateNormal];
[twoReturnB addTarget:self
action:@selector(twoReturnTouchDown:)
forControlEvents:UIControlEventTouchDown];
[twoInputView addSubview:twoReturnB];
twoTF.inputView = twoInputView;
[twoInputView release];
[self.view addSubview:twoTF];
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// normal text field with normal keyboard (216 height keyboard)
normalTF = [[UITextField alloc] initWithFrame:CGRectMake(10, 90, 300, 30)];
normalTF.borderStyle = UITextBorderStyleRoundedRect;
normalTF.text = @"normal";
normalTF.delegate = self;
[self.view addSubview:normalTF];
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// Label that displays the keyboard height from keyboardWillShowNotification
keyboardWillShowNotificationL = [[UILabel alloc] initWithFrame:CGRectMake(10, 130, 300, 30)];
keyboardWillShowNotificationL.font = [UIFont systemFontOfSize:14];
keyboardWillShowNotificationL.text = @"keyboardWillShowNotification kbHeight:";
[self.view addSubview:keyboardWillShowNotificationL];
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// Label that displays the keyboard height from keyboardDidShowNotification
keyboardDidShowNotificationL = [[UILabel alloc] initWithFrame:CGRectMake(10, 170, 300, 30)];
keyboardDidShowNotificationL.font = [UIFont systemFontOfSize:14];
keyboardDidShowNotificationL.text = @"keyboardDidShowNotification kbHeight:";
[self.view addSubview:keyboardDidShowNotificationL];
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// Register for keyboard notifications.
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillShowNotification:)
name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardDidShowNotification:)
name:UIKeyboardDidShowNotification object:nil];
return self;
}
- (void) dealloc
{
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
// Deregister for keyboard notifications
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardDidShowNotification object:nil];
[oneTF release];
[twoTF release];
[normalTF release];
[keyboardWillShowNotificationL release];
[keyboardDidShowNotificationL release];
[super dealloc];
}
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (void) oneReturnTouchDown:(id)sender
{
[oneTF.delegate textFieldShouldReturn:oneTF];
}
- (void) twoReturnTouchDown:(id)sneder
{
[twoTF.delegate textFieldShouldReturn:twoTF];
}
- (void) keyboardWillShowNotification:(NSNotification *)aNotification
{
NSDictionary *info = [aNotification userInfo];
CGFloat kbHeight =
[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
NSString *string = [[NSString alloc] initWithFormat:@"keyboardWillShowNotification kbHeight: %.2f", kbHeight];
NSLog(@"%@", string);
keyboardWillShowNotificationL.text = string;
[string release];
}
- (void) keyboardDidShowNotification:(NSNotification *)aNotification
{
NSDictionary *info = [aNotification userInfo];
CGFloat kbHeight =
[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
NSString *string = [[NSString alloc] initWithFormat:@"keyboardDidShowNotification kbHeight: %.2f", kbHeight];
NSLog(@"%@", string);
keyboardDidShowNotificationL.text = string;
[string release];
}
@end
Solución
Como se informó en esta pregunta, la start frame
(Keyed por UIKeyboardFrameBeginUserInfoKey
) es donde está el teclado en el comienzo de la animación. UIKeyboardFrameEndUserInfoKey
debería conseguirte el end frame
en cambio. Presumiblemente, el tamaño también es diferente entre los cuadros.