先看效果:
首先是我们在ViewDidLoada()中注册了两个通知,[NSNotificationCenterdefaultCenter],检测键盘动态,一个是键盘将要弹出的时候,另一个是键盘将要退出时候键盘的信息
- - (void)viewDidLoad
- {
- NSLog(@"%@",NSStringFromSelector(_cmd));
- [super viewDidLoad];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidShow:) name:UIKeyboardWillShowNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
- }
检测键盘消息一个六种,根据字面意思差不多都能说明函数作用
UIKeyboardWillShowNotification 通知将要发布时候显示键盘
UIKeyboardDidShowNotification 通知发布后立即显示键盘
UIKeyboardWillHideNotification 通知发布前撤销键盘
UIKeyboardDidHideNotification 通知发布后撤销键盘
UIKeyboardWillChangeFrameNotification 通知发布前迅速变化的框架的键盘。
UIKeyboardDidChangeFrameNotification 通知发布后立即改变在键盘的框架。
NSLog(@"%@",NSStringFromSelector(_cmd));是我特意加上去的,它能在控制台显示打印出当前程序所调用的函数,我在下面每个函数都加了这一句,当我进行不同操作的时候,打印出被调用函数名,在调试程序时候比较适用吧;
注册消息通知后,实现通知所响应的方法
- - (void)handleKeyboardDidShow:(NSNotification *)notification
- {
- NSLog(@"%@",NSStringFromSelector(_cmd));
- NSDictionary *info = [notification userInfo];
- CGRect keyboardFrame;
- [[info objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];
- CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size;
- CGFloat distanceToMove = kbSize.height;
- NSLog(@"---->动态键盘高度:%f",distanceToMove);
- if (exitButton == nil) {
- exitButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- CGRect exitBtFrame = CGRectMake(self.view.frame.size.width-40, self.view.frame.size.height - distanceToMove, 40.0f, 30.0f);
- exitButton.frame = exitBtFrame;
- [exitButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateNormal];
- [self.view addSubview:exitButton];
- }
- exitButton.hidden=NO;
- [self adjustPanelsWithKeyBordHeight:distanceToMove];
- [exitButton addTarget:self action:@selector(CancelBackKeyboard:) forControlEvents:UIControlEventTouchDown];
- }
在这个函数方法中值得探讨的是关于键盘所包含信息,因为每一次键盘弹出的时候也是动画形式弹出,他的坐标位置大小包含在userInfo的字典中,现在我用
NSLog(@"-->info:%@",info);打印出info对象,这些信息都可以在不同存储类型,取值的时候注意取值方式,此处只是提一提,希望以后有时间在做探讨,
- - (void)handleKeyboardWillHide:(NSNotification *)notification
- {
- NSLog(@"%@",NSStringFromSelector(_cmd));
- if (exitButton.hidden==NO) {
- exitButton.hidden = YES;
- }
- // if (exitButton.superview)
- // {
- // [exitButton removeFromSuperview];
- // [exitButton release];
- // }
- }
- -(void)adjustPanelsWithKeyBordHeight:(float) height
- {
- NSLog(@"%@",NSStringFromSelector(_cmd));
- if (exitButton) {
- CGRect exitBtFrame = CGRectMake(self.view.frame.size.width - 40, self.view.frame.size.height - height-30, 40.0f, 30.0f);
- exitButton.frame = exitBtFrame;
- [self.view addSubview:exitButton];
- }
- // UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
- // if (exitButton.superview == nil)
- // {
- // [tempWindow addSubview:exitButton];
- // // 注意这里直接加到window上
- // }
- }
- -(void)CancelBackKeyboard:(id)sender
- {
- NSLog(@"%@",NSStringFromSelector(_cmd));
- [textField resignFirstResponder];
- }
- - (void)viewDidUnload
- {
- [self setTextField:nil];
- exitButton=nil;
- [super viewDidUnload];
- // Release any retained subviews of the main view.
- }
- - (void)dealloc {
- [textField release];
- [exitButton release];
- [[NSNotificationCenter defaultCenter] removeObserver:self];//移除所注册的通知
- [super dealloc];
- }
源代码:http://download.youkuaiyun.com/detail/duxinfeng2010/4831311