注意:要想实时获取键盘的高度,比如当前如果是中文那么就会增高的。那么需要使用  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. HUAWEI交换机配置telnet登录

    Huawei交换机配置Telnet登录 一,交换机开启Telnet服务 <Huawei>system-view                                        ...

  2. Developing

    To work with the Android code, you will need to use both Git and Repo. In most situations, you can u ...

  3. 创建安卓模拟器的两种方式及常用Android命令介绍

    创建安卓模拟器有以下两种方式: 1>通过图形界面创建,在Eclipse中单击Windows->Android Virtual Device Manager启动图形界面窗口 2>如果用 ...

  4. return_url notify_url

    return_url对返回订单状态进行更新和判断,notify_url为异步调动页面,需要先判断notify_url里是否对订单数据做过处理,避免重复更新数据,然后如果用户付款成功直接关闭页面,会造成 ...

  5. final,buaa_oo conclusion

    UML系列作业设计架构 第13次作业 本单元的第一次作业中,涉及到了类图的解析.在着手做这单元作业的时候,需要将每一种 UmlElement 再封装,并在解析时,用 helper 单例来进行查询处理( ...

  6. luogu1963 [NOI2009]变换序列

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; int ...

  7. Cookie窃取实验

    文章:IE/FIREFOX/CHROME等浏览器保存COOKIE的位置 Chrome的Cookie数据位于:%LOCALAPPDATA%\Google\Chrome\User Data\Default ...

  8. HDU-1532 Drainage Ditches,人生第一道网络流!

    Drainage Ditches 自己拉的专题里面没有这题,网上找博客学习网络流的时候看到闯亮学长的博客然后看到这个网络流入门题!随手一敲WA了几发看讨论区才发现坑点! 本题采用的是Edmonds-K ...

  9. 在VS2017中编写Python程序

    最近开始了python的学习,在搭建完python环境之后,在选择IDE的时候陷入了困境,首先选择的是PyCharm但是用着还是不习惯,毕竟用VS开发了几年了,突然换软件总感觉有点不适应,就想到了强大 ...

  10. [LOJ#2270][BZOJ4912][SDOI2017]天才黑客

    [LOJ#2270][BZOJ4912][SDOI2017]天才黑客 试题描述 SD0062 号选手小 Q 同学为了偷到 SDOI7012 的试题,利用高超的黑客技术潜入了 SDOI 出题组的内联网的 ...