如何在IOS虚拟键盘上添加动态隐藏按钮

悟途网 2013年06月06日 22:25 阅读()
字号 (A- A+)

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

 
先看效果:
IOS虚拟键盘上添加动态隐藏按钮   IOS虚拟键盘上添加动态隐藏按钮 
 
IOS虚拟键盘上添加动态隐藏按钮 IOS虚拟键盘上添加动态隐藏按钮 
 
 
首先是我们在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));是我特意加上去的,它能在控制台显示打印出当前程序所调用的函数,我在下面每个函数都加了这一句,当我进行不同操作的时候,打印出被调用函数名,在调试程序时候比较适用吧;
IOS虚拟键盘上添加动态隐藏按钮
 
注册消息通知后,实现通知所响应的方法
 
- (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对象,这些信息都可以在不同存储类型,取值的时候注意取值方式,此处只是提一提,希望以后有时间在做探讨,
IOS虚拟键盘上添加动态隐藏按钮

在这一段代码上,后面注释了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];
}

热门文章
随机推荐
苹果iPhone手机有锁和无锁的区别是什么?

苹果iPhone手机有锁和无锁的

iPhone有锁和无锁有什么区别?有锁版iPhone,无论是否已解...

iPhone呼吸灯在哪与怎么开启?

iPhone呼吸灯在哪与怎么开启

安卓手机用户一定对“呼吸灯”再熟悉不过了,它一般...

IOS8的五大技巧你肯定不知道

IOS8的五大技巧你肯定不知道

IOS8的五大技巧,手机信号格数精确到数值,众所周知,...

iPhone手机延长续航系统设置的方法

iPhone手机延长续航系统设置

对于 iPhone 用户来说,设备的续航似乎总是不太够用,...

苹果设备如何设置iPhone与ipad玩游戏的时间

苹果设备如何设置iPhone与

怎么限制iPhone、ipad玩手机游戏的时间?现在家庭苹果设...

Apple ID两步验证的作用是什么?

Apple ID两步验证的作用是什

近日,有不少网友表示自己遇到了 Apple ID 被盗的问题,...

iPhone 6速度变慢只需4步让应用秒开的方法

iPhone 6速度变慢只需4步让应

iPhone新品上市前,你那想刷卡的手是否已经饥渴难耐?...

iPhone iOS9.3 Night Shift在哪及功能怎么使用?

iPhone iOS9.3 Night Shift在哪及功

iOS9.3 night shift在哪?iOS9.3 night shift功能怎么用?night ...