11

次のコード (長々と申し訳ありません) は、iOS 4.3 (おそらく他のバージョンも) で奇妙な動作を示します。この例では、3UITextFieldつの異なるサイズのキーボードを持つ 3 つの があります。1 つのテキスト フィールドの編集を開始し、[戻る] をタッチしてキーボードを閉じると、キーボード サイズが正しく返されUIKeyboardWillShowNotification、.UIKeyboardDidShowNotificationUIKeyboardFrameBeginUserInfoKey

下記参照:

- (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)

予期しない動作は、テキスト フィールドの編集を開始すると、最初のキーボードのサイズが報告される (予想される) ことです。2 番目のテキスト フィールドを (return に触れずに) タッチすると、2 番目のサイズではなく、最初のキーボードのサイズが (予期せず) レポートされます。3 番目のテキスト フィールドを (リターンに触れずに) タッチすると、3 番目のサイズではなく、2 番目のキーボード サイズが (予期せず) 報告されます。2回目から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)

バグ レポートを送信する前に、何も見落としていないことを確認したいだけです。

参考までに、キーボードによって隠されているテキストフィールドが表示されるようにビューをシフトするときに、正しいことをしようとしているときに(UIKeyboardWillShowNotificationまたはUIKeyboardDidShowNotificationUIKeyboardFrameBeginUserInfoKeyを使用してキーボードのサイズを取得するときに)、これを見つけました。参照:

キーボードが存在するときにUITextFieldを上に移動させる方法は?

iOS ライブラリ: iOS 用テキスト、Web、および編集プログラミング ガイド --> キーボードの管理

iOS ライブラリ: iOS 用スクロール ビュー プログラミング ガイド --> スクロール ビューの作成と構成

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
4

1 に答える 1

26

この質問で報告されているように、start frame( でキー付けされたUIKeyboardFrameBeginUserInfoKey)は、キーボードがアニメーションの最初にある場所です。UIKeyboardFrameEndUserInfoKey代わりにを取得する必要がありますend frame。おそらく、フレーム間でサイズも異なります。

キーリファレンス: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/doc/constant_group/Keyboard_Notification_User_Info_Keys

于 2011-10-11T03:50:49.897 に答える