新风作浪博客学习(十九)在iOS虚拟键盘上添加动态隐藏按钮

为了给用户比较良好的交付,想在键盘上添加一个按钮,实时根据键盘不同高度变换按钮位置,再不做输入的时候点击按钮能够隐藏键盘,这种方式在很多软件上都有体现,然后在网上查阅了关于检测键盘高度一些相关知识,以下是一个Demo,代码有很多需要优化地方,仅供需要者参考;


先看效果:
[img]
[img]http://dl.iteye.com/upload/attachment/0079/6874/e62e099d-19ab-3c95-9667-87bd077329dc.png[/img]
[/img]

[img]
[img]http://dl.iteye.com/upload/attachment/0079/6876/2b8157ca-bafd-35dd-a03a-f81ded045a27.png[/img]
[/img]

[img]
[img]http://dl.iteye.com/upload/attachment/0079/6878/316f56ef-6699-3b6d-9339-aafb07b82c11.png[/img]
[/img]

[img]
[img]http://dl.iteye.com/upload/attachment/0079/6880/a66264b9-855c-392e-91b9-819e684eaca8.png[/img]
[/img]


首先是我们在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 通知发布后立即改变在键盘的框架。


[color=red]NSLog(@"%@",NSStringFromSelector(_cmd));是我特意加上去的,它能在控制台显示打印出当前程序所调用的函数,我在下面每个函数都加了这一句,当我进行不同操作的时候,打印出被调用函数名,在调试程序时候比较适用吧;[/color]
[img]
[img]http://dl.iteye.com/upload/attachment/0079/6882/bcd43265-c951-3e3d-a16e-b919d6460d3d.png[/img]
[/img]


注册消息通知后,实现通知所响应的方法:
- (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对象,这些信息都可以在不同存储类型,取值的时候注意取值方式,此处只是提一提,希望以后有时间在做探讨,

[img]
[img]http://dl.iteye.com/upload/attachment/0079/6884/c973e458-f279-3176-a839-24ca63ff3647.png[/img]
[/img]


在这一段代码上,后面注释了5行,因为打算当键盘推出的时候,按钮从视图上移除,或者释放按钮,但是都导致了应用程序崩溃,后来就没有释放和移除操作了
- (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];
}



源码:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值