2011-07-25 17 views
10

Poniższy kod (przepraszam za długość) wyświetla dziwne zachowanie pod iOS 4.3 (może również w wersji innej). W tym przykładzie są trzy różne modele o trzech klawiaturach o różnych rozmiarach. Jeśli zaczniesz edytować jedno pole tekstowe, a następnie dotknij "return", odrzucając klawiaturę, za każdym razem, gdy rozmiar klawiatury zostanie poprawnie zwrócony w UIKeyboardWillShowNotification i UIKeyboardDidShowNotification, używając UIKeyboardFrameBeginUserInfoKey.UIKeyboardWillShowNotification & UIKeyboardDidShowNotification raport błędna wysokość klawiatury

patrz poniżej:

- (void) keyboardWillShowNotification:(NSNotification *)aNotification

i

- (void) keyboardDidShowNotification:(NSNotification *)aNotification

Należy pamiętać, że jest to oczekiwane zachowanie.

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) 

Nieoczekiwane zachowanie jest, jeśli zaczniemy edycję pola tekstowego wielkość pierwszej klawiatury jest zgłoszony (oczekiwane). Po dotknięciu drugiego pola tekstowego (bez dotykania powrotu), rozmiar pierwszej klawiatury jest zgłaszany (nieoczekiwany) zamiast rozmiaru drugiego. Po dotknięciu trzeciego pola tekstowego (bez dotykania powrotu), rozmiar drugiego rozmiaru klawiatury jest zgłaszany (nieoczekiwany) zamiast rozmiaru trzeciego. Od drugiego do n-tego razy wygląda na to, że raportuje poprzedni rozmiar klawiatury, a nie ten, który zostanie wyświetlony.

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) 

Zanim prześlę zgłoszenie błędu, chcę się upewnić, że nic nie przeszedłem.

FYI I stubbled po tym, starając się zrobić dobry uczynek (używając UIKeyboardWillShowNotification lub UIKeyboardDidShowNotification i UIKeyboardFrameBeginUserInfoKey dostać rozmiaru klawiaturze) podczas przesuwania widoku tak, że pole tekstowe, które zostałyby zasłonięte przez klawiaturę jest widoczny. Numer referencyjny:

How to make a UITextField move up when keyboard is present?

iOS Library: Text, Web, and Editing Programming Guide for iOS --> Managing the Keyboard

iOS Library: Scroll View Programming Guide for iOS --> Creating and Configuring Scroll Views

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 

Odpowiedz

25

Jak podano w this question The start frame (włączył przez UIKeyboardFrameBeginUserInfoKey) jest, gdy klawiatura jest w rozpoczynającego animacji. UIKeyboardFrameEndUserInfoKey powinien zamiast tego dostarczyć Ci numer end frame. Przypuszczalnie rozmiar różni się także między ramkami.

Key referencyjny: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/doc/constant_group/Keyboard_Notification_User_Info_Keys

+0

Dzięki za wskazanie, że należy używać UIKeyboardFrameEndUserInfoKey. Kiedy początkowo przeglądałem dokumentację, nie było dla mnie jasne, jaka była różnica pomiędzy UIKeyboardFrameBeginUserInfoKey i UIKeyboardFrameEndUserInfoKey. Dziękuję za wyjaśnienie. – mmorris

+0

Doskonale!Jest to niejasny przypadek, w którym właśnie wpadłem na mieszanie standardowych klawiatur i narzędzi do wybierania daty i na szczęście znalazłem twój post. UIKeyboardFrameEndUserInfoKey jest kluczowym elementem potrzebnej informacji !!! –

Powiązane problemy