在iOS虚拟键盘上添加动态隐藏按钮

简介:

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


先看效果:

     


    

       


首先是我们在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对象,这些信息都可以在不同存储类型,取值的时候注意取值方式,此处只是提一提,希望以后有时间在做探讨,




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




源代码:http://download.csdn.net/detail/duxinfeng2010/4831311





     本文转自新风作浪 51CTO博客,原文链接:http://blog.51cto.com/duxinfeng/1208706,如需转载请自行联系原作者




相关文章
|
7天前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
8天前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
29 1
|
16天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
25天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
1天前
|
移动开发 前端开发 Swift
iOS 最好的应用程序开发编程语言竟然是这7种
iOS 最好的应用程序开发编程语言竟然是这7种
22 8
|
3天前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。