猫猫分享,必须精品

素材代码地址:http://blog.csdn.net/u013357243/article/details/45165591
原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://blog.csdn.net/u013357243?viewmode=contents

先看效果

制作思路

猫猫在做这个的时候,首先用stroyboard画出来界面UI,这个很简单,不多说了,然后下一步就是自定义xib做键盘上面的那一栏了,需要自己做xib还有view,详细代码下面会有,当我们点击的时候,我们的键盘的frame变化形成弹出的效果,这个在前面QQ案例里面有,其实就是通知的用法,其中我们自定义工具条的“上一个”“下一个”“完成”这些按钮,我们用了代理的方式来完成的。

代码,注意点

代理

首先我们要自己写自己的代理:

@protocol NYKeyboardToolDelegate <NSObject> -(void)keyboardTool:(NYKeyboardTool *)keyboardTool didClickItemType:(KeyboardItemType)itemType;@end

然后要在我们设置代理的类那让他实现我们的协议

@interface NYViewController () <NYKeyboardToolDelegate>

创建工具栏 ,设置代理,把所有的UITextField遍历到放到全局变量_fields中来,设置属性

//创建工具栏NYKeyboardTool *keyboardTool = [NYKeyboardTool keyBoardTool];//设置代理keyboardTool.delegate = self;//1,获取输入框容器的所有子控件NSArray *views = [self.inputContainer subviews];//创建一个数组储存textFieldNSMutableArray *fieldM = [NSMutableArray array];//2,遍历for (UIView *childView in views) {//如果子控件是UITextField的时候,设置inputAccessoryViewif ([childView isKindOfClass:[UITextField class]]) {UITextField *tf = (UITextField *)childView;tf.inputAccessoryView = keyboardTool;//把textField添加到数组中。[fieldM addObject:tf];_fields = fieldM;}}

记住要实现协议方法否则工具条按钮没用

#pragma mark - NYKeyboardToolDelegate代理 键盘工具条的代理-(void)keyboardTool:(NYKeyboardTool *)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];}
}//让上一个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];}}

键盘的frame变化动画,还有通知

初始化自定义键盘

//1:初始化自定义键盘
-(void)setupCustomKeyboard
{UIDatePicker *datePicker = [[UIDatePicker alloc] init];//设置地区datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];//设置模式datePicker.datePickerMode = UIDatePickerModeDate;//把datePicker放到birthday的键盘中self.birthdayField.inputView = datePicker;}

键盘frame变化除了,开通通知
建立监听(通知)

//建立监听[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(kbFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

键盘frame的变化

//键盘的frame的变换
-(void)kbFrameChange:(NSNotification *)noti
{//改变window的背景颜色self.view.window.backgroundColor = self.inputAccessoryView.backgroundColor;//  键盘退出的frameCGRect frame = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];//键盘实时yCGFloat kbEndY = frame.origin.y;//获取当前的响应者int currentIndex = [self getCurrentResponderIndex];UITextField *currentTF = _fields[currentIndex];//应该改变的高度:CGFloat tfMaxY = CGRectGetMaxY(currentTF.frame) + self.inputContainer.frame.origin.y;//如果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;}];}
}

其他小地方

关闭键盘

//开始触摸的方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{//关闭键盘[self.view endEditing:YES];
}

view中又很多UITextField 然后我们想知道哪一个打开了键盘,就是获取哪一个是响应者

//获取当前  textField的响应者在_fields中的索引
//返回-1代表没有找到
-(int)getCurrentResponderIndex
{//遍历所有的textField获取响应值for (UITextField *tf in _fields) {if (tf.isFirstResponder) {return [_fields indexOfObject:tf];}}return -1;
}

UIDatePicker日期键盘的用法:

    UIDatePicker *datePicker = [[UIDatePicker alloc] init];//设置地区datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];//设置模式datePicker.datePickerMode = UIDatePickerModeDate;//把datePicker放到birthday的键盘中self.birthdayField.inputView = datePicker;

ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧。
翟乃玉的博客
地址:http://blog.csdn.net/u013357243?viewmode=contents

转载于:https://www.cnblogs.com/znycat/p/4521030.html

猫猫学IOS(二十四)UI之注册案例相关推荐

  1. (素材源码)猫猫学IOS(十四)UI之UITableView扩充_表格的修改_(增删移动)

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8544315 原文地址:http://blog.csdn.net/u01335 ...

  2. 猫猫学IOS(六)UI之iOS热门游戏_超级猜图

    猫猫分享,必须精品 素材地址:http://blog.csdn.net/u013357243/article/details/44539069 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:ht ...

  3. (素材源码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI

    猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...

  4. (素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8542789 原文地址:http://blog.csdn.net/u01335 ...

  5. 猫猫学IOS(十五)UI之曾经大热的打砖块小游戏

    猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44814523 原文地址:http://blog.csdn.net/ ...

  6. (素材源码)猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8572001 原文地址:http://blog.csdn.net/u01335 ...

  7. 猫猫学IOS(十八)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复

    猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/45000699 原文地址:http://blog.csdn.net/ ...

  8. (素材源码)猫猫学IOS(十五)UI之曾经大热的打砖块小游戏

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8555567 原文地址:http://blog.csdn.net/u01335 ...

  9. (素材源码)猫猫学IOS(十八)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8585703 原文地址:http://blog.csdn.net/u01335 ...

  10. (素材源码)猫猫学IOS(十七)UI之纯代码自定义Cell实现新浪微博UI

    猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8580249 原文地址:http://blog.csdn.net/u01335 ...

最新文章

  1. 在Ubuntu虚拟机中配置bridge共享上网
  2. suse linux 10 下安装sybase15.0.3,SUSE10下安装sybase ASE15.0
  3. python中的format方法和int方法
  4. matlab根据转移函数绘制放大器幅频响应和相频响应
  5. 中学编程_您可以从30岁的第一次编程采访中学到什么
  6. 用户代码未处理nullreferenceexception_CSAPP 第九章整理 未完成
  7. 报错,sql语句中尽量不要使用*,只查询需要的字段出来
  8. 实时体积云渲染(地平线):一.云的生成
  9. 准备mybatis-spring
  10. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
  11. 单机安装DynamicsAX2012R3VM
  12. attiny85(digispark)零延迟启动探究
  13. How to read PCA biplots and scree plots
  14. 贸易融资名词解析:出口押汇与进口押汇
  15. 形容谣言的四字词语_描写传递信息的四字词语
  16. 基于百度、高德路线规划的出行圈获取
  17. 水果店线下营销玩法有哪些,水果店前期营销方案有哪些
  18. pip 如何查看一个包所有的历史版本
  19. 容量因子k计算公式_K因子计算方法
  20. java中trim_JAVA中trim()函数使用方法

热门文章

  1. matlab学习200316
  2. sqlserver bulk insert
  3. JVM 1.类的加载、连接、初始化
  4. WordPress 全方位优化指南(下)
  5. .NET Framework 4.0-RequestValidationMode
  6. 程序21、程序22和程序23
  7. 技巧/诀窍:在ASP.NET中重写URL(转)
  8. 《LeetCode力扣练习》第15题 C语言版 (做出来就行,别问我效率。。。。)
  9. linux 无法挂载系统,解决无法挂载Linux文件系统的问题
  10. android edittext输入邮箱,[Android教程]EditText怎样限制用户的输入?数字/字母/邮箱