键盘处理(HM)
2015-07-27 14:56
344 查看
// // HMViewController.m // 作业-注册 // // Created by Vincent_Guo on 14-8-27. // Copyright (c) 2014年 vgios. All rights reserved. // #import "HMViewController.h" #import "HMKeyboardTool.h" @interface HMViewController ()<HMKeyboardToolDelegate>{ NSArray *_fields;//存储所有的textField } @property (weak, nonatomic) IBOutlet UITextField *birthdayField; @property (weak, nonatomic) IBOutlet UIView *inputContainer;//输入框容器view @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //1.初始化自定议键盘 [self setupCustomKeyboard]; //2.设置每一个textfield的键盘工具view(inputAccessoryView) [self setupKeyboardTool]; //3.监听键盘的事件 [self setupKeyoardNotification]; NSLog(@"%@",_fields); } //1.初始化自定议键盘 -(void)setupCustomKeyboard{ UIDatePicker *datePicker = [[UIDatePicker alloc] init]; datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"]; datePicker.datePickerMode = UIDatePickerModeDate; self.birthdayField.inputView = datePicker; } //设置每一个textfield的键盘工具view(inputAccessoryView) -(void)setupKeyboardTool{ //创建工具栏 HMKeyboardTool *tool = [HMKeyboardTool keyboardTool]; //设置代理 tool.delgate = self; //1.获取输入框窗口所有子控件 NSArray *views = self.inputContainer.subviews; //创建一个数据存储textfield NSMutableArray *fieldsM = [NSMutableArray array]; //2.遍历 for (UIView *child in views) { //如果子控制是UITextField的时候,设置inputAccessoryView if ([child isKindOfClass:[UITextField class]]) { UITextField *tf = (UITextField *)child; tf.inputAccessoryView = tool; //把textfield添加到数组 [fieldsM addObject:tf]; } } _fields = fieldsM; } -(void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; } //3.监听键盘的事件 -(void)setupKeyoardNotification{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kbFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil]; } //键盘的frame的变化 -(void)kbFrameChange:(NSNotification *)nofifi{ //NSLog(@"%@",nofifi); //获取键盘改变化的y值 //这键盘结束时的frm CGRect kbEndFrm =[nofifi.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; //键盘结束时的y CGFloat kbEndY = kbEndFrm.origin.y; //获取当前的响应者 int currentIndex = [self getCurrentResponderIndex]; UITextField *currentTf = _fields[currentIndex]; CGFloat tfMaxY = CGRectGetMaxY(currentTf.frame) + self.inputContainer.frame.origin.y; NSLog(@"%f %f",kbEndY,tfMaxY); //改变控制器view的transform //如果textfield的最大值在于键盘的y坐,才要往上移 if (tfMaxY > kbEndY) { [UIView animateWithDuration:0.25 animations:^{ self.view.transform = CGAffineTransformMakeTranslation(0, kbEndY - tfMaxY); }]; }else{ [UIView animateWithDuration:0.25 animations:^{ self.view.transform = CGAffineTransformIdentity; }]; } } #pragma mark 键盘工具条的代理 -(void)keyboardTool:(HMKeyboardTool *)keyboardTool didClickItemType:(KeyboardItemType)itemType{ //获取当前的响应者的索引 int currentIndex = [self getCurrentResponderIndex]; NSLog(@"当前的响应者 %d",currentIndex); if (itemType == KeyboardItemTypePrevious) { NSLog(@"上一个"); //让上一个field成功响应者 [self showProviousField:currentIndex]; }else if(itemType == KeyboardItemTypeNext){ NSLog(@"下一个"); //让下一个field成功响应者 [self showNextField:currentIndex]; }else{ NSLog(@"完成"); [self touchesBegan:nil withEvent:nil]; } } //获取当前textfield的响应者索引 //如果返回-1代理没有找响应者 -(int)getCurrentResponderIndex{ //遍历所有的textfield获取响应者 for (UITextField *tf in _fields) { if (tf.isFirstResponder) { return [_fields indexOfObject:tf]; } } return -1; } //让上一个field成功响应者 -(void)showProviousField:(int)currentIndex{ int proviousIndex = currentIndex - 1; if (proviousIndex > 0 ) { UITextField *proviousTf = [_fields objectAtIndex:proviousIndex]; [proviousTf becomeFirstResponder]; } } //让下一个field成功响应者 -(void)showNextField:(int)currentIndex{ int nextIndex = currentIndex + 1; //下一个索引不能超过_fields数组的个数 if (nextIndex < _fields.count) { //让当前响应者分发去 UITextField *currentTf = [_fields objectAtIndex:currentIndex]; [currentTf resignFirstResponder]; UITextField *nextTf = [_fields objectAtIndex:nextIndex]; [nextTf becomeFirstResponder]; } } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES]; [UIView animateWithDuration:0.25 animations:^{ self.view.transform = CGAffineTransformIdentity; }]; } @end
相关文章推荐
- Intellij IDEA远程调试tomcat
- 前端面试题库
- tilemill和html嵌入地图
- 声波通信原理及源代码
- Spark 调优
- android_framework_permissions
- C语言中字符串操作之 strstr()
- app Framework基础知识
- 法猿生存计划--左边的管理,技术正确
- openfire的配置
- 用JFinal进行web开发
- 威威猫系列故事——打地鼠(简单Dp填数)
- C++中的函数指针和函数对象总结
- Windows下TortoiseGit over Putty or Openssh提交项目到GitLab
- js验证日期格式
- IOS socket开发基础
- php实现给出定值,自然数的组合问题
- Cocos2d-js 3.x 动作
- Android中app卡顿原因分析(ios顺滑)
- HTTP协议学习笔记(一)