注意:要想实时获取键盘的高度,比如当前如果是中文那么就会增高的。那么需要使用  UIKeyboardFrameEndUserInfoKey 而不是 UIKeyboardFrameBeginUserInfoKey,后者将获取到的是上次的高度,而前者是键盘动画完成后的最终高度。

The following code (sorry for the length) displays an odd behavior under iOS 4.3 (maybe others version too). In this example, there are three UITextFields that have three different sized keyboards. If you start editing one text field and then touch "return" dismissing the keyboard, each time the keyboard size is returned correctly in UIKeyboardWillShowNotification and UIKeyboardDidShowNotification using UIKeyboardFrameBeginUserInfoKey.

see below:

- (void) keyboardWillShowNotification:(NSNotification *)aNotification

and

- (void) keyboardDidShowNotification:(NSNotification *)aNotification

Note that this is the expected behavior.

action                 reported keyboard size  expected keyboard size
-----------------------------------------------------------------
touch one &return100100
touch two &return200200
touch normal &return216216
n &return keyboard size(n) keyboard size(n)

The unexpected behavior is if you start editing a text field the size of the first keyboard is reported (expected). When you touch the second text field (without touching return), the size of first keyboard is reported (unexpected) instead of the size of the second. When you touch the third text field (without touching return), the size of the second keyboard size is reported (unexpected) instead of the size of the third. For the second to nth times, it seems like it is reporting the previous keyboard's size not the one that will be displayed.

action        reported keyboard size  expected keyboard size
--------------------------------------------------------
touch one 100100
touch two 100200
touch normal 200216
touch one 216100
n keyboard size(n-1) keyboard size(n)

Before I send in a bug report, I just want to make sure that I have not over looked anything.

FYI I stubbled upon this while trying to do the right thing (using UIKeyboardWillShowNotification or UIKeyboardDidShowNotification and UIKeyboardFrameBeginUserInfoKey to get the keyboard's size) when shifting a view so that a text field that would have been obscured by a keyboard is visible. Reference:

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>@interfaceBugVC: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"@implementationBugVC-(id) init
{if(!(self=[super init])){returnself;}// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =// 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 fieldUIView*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 fieldUIView*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:UIKeyboardWillShowNotificationobject:nil];[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardDidShowNotification:)
name:UIKeyboardDidShowNotificationobject:nil];returnself;}-(void) dealloc
{// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =// Deregister for keyboard notifications[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardWillShowNotificationobject:nil];[[NSNotificationCenter defaultCenter]
removeObserver:self
name:UIKeyboardDidShowNotificationobject: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
asked Jul 25 '11 at 20:54
mmorris
2,92121225
 

add comment

1 Answer

up vote
11
down vote

accepted

As reported in this question, the start frame (keyed by UIKeyboardFrameBeginUserInfoKey) is where the keyboard is at the beginning of the animation. UIKeyboardFrameEndUserInfoKey should get you the end frame instead. Presumably the size is also different between the frames.

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

实时获取键盘高度 CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;的更多相关文章

  1. ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)(转载)

    背景: ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度(包括米聊也是这么做的). 可是在ios5中,键盘布局变了, ...

  2. js如何获取键盘高度

    在移动端或混合app开发中,js如何获取键盘高度,直接贴上代码吧 input是一个html input 标签 var timer = { id:null, run:function (callback ...

  3. react native 之 获取键盘高度

    多说不如多撸: /** * Created by shaotingzhou on 2017/2/23. *//** * Sample React Native App * https://github ...

  4. iOS、Xcode监测键盘的显示和隐藏变化,并获得键盘高度,改变tableView的frame和偏移

    <pre name="code" class="objc"><pre name="code" class="ob ...

  5. iOS键盘中英文切换键盘高度获取通知方法

    iOS键盘中英文切换键盘高度获取通知方法, 有需要的朋友可以参考下. 注册通知 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppea ...

  6. iOS之 利用通知(NSNotificationCenter)获取键盘的高度,以及显示和隐藏键盘时修改界面的注意事项

    我们在开发中会遇到这样的情况:调用键盘时需要界面有一个调整,避免键盘遮掩输入框. 但实现时你会发现,在不同的手机上键盘的高度是不同的.这里列举一下: //获取键盘的高度 /* iphone 6: 中文 ...

  7. iOS键盘高度的获取

    代码如下: - (void)viewDidLoad { [super viewDidLoad]; //增加监听,当键盘出现或改变时收出消息 [[NSNotificationCenter default ...

  8. Swift3.0 键盘高度监听获取

    方法:通过通知监听键盘的动态 1.键盘的动态有四种: public static let UIKeyboardWillShow: NSNotification.Name public static l ...

  9. iOS键盘高度自适应(中英文输入)

    一:添加通知监测键盘高度变化 [self keyBoardAutoSize]; 二:动态改变高度 #pragma mark keyboard height auto /* NSNotification ...

随机推荐

  1. css去除链接 input 虚框

    /* css去掉虚框 */ :focus{-webkit-outline-style:none;-moz-outline-style:none;-ms-outline-style:none;-o-ou ...

  2. JS中关于clientWidth offsetWidth scrollWidth 等的含义的详细介绍

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  3. stm32L011F3——串口实例

    /* STM32L0xx HAL library initialization: - Configure the Flash prefetch, Flash preread and Buffer ca ...

  4. 【HIHOCODER 1529】 不上升序列

    描述 给定一个长度为 n 的非负整数序列 a[1..n]. 你每次可以花费 1 的代价给某个 a[i] 加1或者减1. 求最少需要多少代价能将这个序列变成一个不上升序列. 输入 第一行一个正整数 n. ...

  5. logistic回归原理和公式

    转自:http://blog.csdn.net/ariessurfer/article/details/41310525 Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素 ...

  6. Python第三方库之openpyxl(7)

    Python第三方库之openpyxl(7) 散点图 散点或xy图表类似于一些折线图.主要的区别在于,一个系列的值被绘制在另一个值上.当值未排序时,这是有用的. from openpyxl impor ...

  7. HDU 3947 River Problem

    River Problem Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...

  8. HDU 4280 Island Transport

    Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...

  9. POJ-2187 Beauty Contest,旋转卡壳求解平面最远点对!

     凸包(旋转卡壳) 大概理解了凸包A了两道模板题之后在去吃饭的路上想了想什么叫旋转卡壳呢?回来无聊就搜了一下,结果发现其范围真广. 凸包: 凸包就是给定平面图上的一些点集(二维图包),然后求点集组成的 ...

  10. MySQL binlog_rows_query_log_events在线设置无效

    binlog_rows_query_log_events 对binlog_format=row有效,设为true后可以在binary log中记录原始的语句 官方文档显示binlog_rows_que ...