Следующий код (извините за длину) отображает нечетное поведение в iOS 4.3 (возможно, и другие версии). В этом примере есть три UITextField
, которые имеют три клавиатуры различного размера. Если вы начнете редактировать одно текстовое поле, а затем коснитесь "return", отклоняя клавиатуру, каждый раз, когда размер клавиатуры будет корректно возвращен в UIKeyboardWillShowNotification
и UIKeyboardDidShowNotification
с помощью UIKeyboardFrameBeginUserInfoKey
.
см. ниже:
- (void) keyboardWillShowNotification:(NSNotification *)aNotification
и
- (void) keyboardDidShowNotification:(NSNotification *)aNotification
Обратите внимание, что это ожидаемое поведение.
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)
Неожиданное поведение - если вы начнете редактировать текстовое поле, сообщается (ожидается) размер первой клавиатуры. Когда вы касаетесь второго текстового поля (не касаясь возврата), размер первой клавиатуры сообщается (неожиданно), а не размер второй. Когда вы касаетесь третьего текстового поля (без касания возврата), размер второго размера клавиатуры сообщается (неожиданно), а не размер третьего. В течение второго-девятого раз кажется, что он сообщает, что предыдущий размер клавиатуры не тот, который будет отображаться.
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)
Прежде чем отправить отчет об ошибке, я просто хочу удостовериться, что я ничего не видел.
FYI Я наткнулся на это, пытаясь сделать правильную вещь (используя UIKeyboardWillShowNotification
или UIKeyboardDidShowNotification
и UIKeyboardFrameBeginUserInfoKey
, чтобы получить размер клавиатуры) при перемещении представления, чтобы текстовое поле, которое было бы закрыто клавиатура видна. Справка:
Как заставить UITextField двигаться вверх, когда клавиатура присутствует?
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