猫猫学IOS(二十四)UI之注册案例
猫猫分享,必须精品
素材代码地址: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之注册案例相关推荐
- (素材源码)猫猫学IOS(十四)UI之UITableView扩充_表格的修改_(增删移动)
猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8544315 原文地址:http://blog.csdn.net/u01335 ...
- 猫猫学IOS(六)UI之iOS热门游戏_超级猜图
猫猫分享,必须精品 素材地址:http://blog.csdn.net/u013357243/article/details/44539069 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:ht ...
- (素材源码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI
猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...
- (素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习
猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8542789 原文地址:http://blog.csdn.net/u01335 ...
- 猫猫学IOS(十五)UI之曾经大热的打砖块小游戏
猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44814523 原文地址:http://blog.csdn.net/ ...
- (素材源码)猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI
猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8572001 原文地址:http://blog.csdn.net/u01335 ...
- 猫猫学IOS(十八)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复
猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/45000699 原文地址:http://blog.csdn.net/ ...
- (素材源码)猫猫学IOS(十五)UI之曾经大热的打砖块小游戏
猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8555567 原文地址:http://blog.csdn.net/u01335 ...
- (素材源码)猫猫学IOS(十八)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复
猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8585703 原文地址:http://blog.csdn.net/u01335 ...
- (素材源码)猫猫学IOS(十七)UI之纯代码自定义Cell实现新浪微博UI
猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8580249 原文地址:http://blog.csdn.net/u01335 ...
最新文章
- 在Ubuntu虚拟机中配置bridge共享上网
- suse linux 10 下安装sybase15.0.3,SUSE10下安装sybase ASE15.0
- python中的format方法和int方法
- matlab根据转移函数绘制放大器幅频响应和相频响应
- 中学编程_您可以从30岁的第一次编程采访中学到什么
- 用户代码未处理nullreferenceexception_CSAPP 第九章整理 未完成
- 报错,sql语句中尽量不要使用*,只查询需要的字段出来
- 实时体积云渲染(地平线):一.云的生成
- 准备mybatis-spring
- Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
- 单机安装DynamicsAX2012R3VM
- attiny85(digispark)零延迟启动探究
- How to read PCA biplots and scree plots
- 贸易融资名词解析:出口押汇与进口押汇
- 形容谣言的四字词语_描写传递信息的四字词语
- 基于百度、高德路线规划的出行圈获取
- 水果店线下营销玩法有哪些,水果店前期营销方案有哪些
- pip 如何查看一个包所有的历史版本
- 容量因子k计算公式_K因子计算方法
- java中trim_JAVA中trim()函数使用方法
热门文章
- matlab学习200316
- sqlserver bulk insert
- JVM 1.类的加载、连接、初始化
- WordPress 全方位优化指南(下)
- .NET Framework 4.0-RequestValidationMode
- 程序21、程序22和程序23
- 技巧/诀窍:在ASP.NET中重写URL(转)
- 《LeetCode力扣练习》第15题 C语言版 (做出来就行,别问我效率。。。。)
- linux 无法挂载系统,解决无法挂载Linux文件系统的问题
- android edittext输入邮箱,[Android教程]EditText怎样限制用户的输入?数字/字母/邮箱