如何在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也能玩3D Touch:iOS 9越狱插件Forcy

旧iPhone也能玩3D Touch:iOS

iOS9越狱已经告破,越来越多插件正在兼容适配iOS9。今...

iPhone6s动态壁纸动不了如何设置?

iPhone6s动态壁纸动不了如何

iPhone6s中独有的一个功能,那便是3D Touch功能,即屏幕可...

苹果iPhone7手机关闭小圆点的图文方法

苹果iPhone7手机关闭小圆点的

使用iphone手机的用户,想必对于iphone手机上的小圆点不...

iPhone苹果手机桌面图标如何隐藏?

iPhone苹果手机桌面图标如何

许多朋友喜欢吐槽iOS不好用,不够本地化,其中一个原...

iPhone6s Plus Home键异响松动解决办法

iPhone6s Plus Home键异响松动解

iPhone6s Plus Home键异响怎么办?有网友反映称自己的全新...

苹果Home键按不动?iPhone 7重启或进入DFU模式方法

苹果Home键按不动?iPhone 7重

苹果iPhone7的Home键再也按不下去了,改成了压感式按键...

iPhone手机3D Touch的9个实用技巧知道吗?

iPhone手机3D Touch的9个实用技

苹果给iPhone 6s添加了3D Touch技术,而对于这一技术你到...

iPhone苹果手机充电充不进去无法充电的解决方法

iPhone苹果手机充电充不进去

许多刚入手苹果手机的用户可能觉得电池很耐用,基本...