IOS第12天(4,作业弹出键盘上加上(xib)view的处理,时间选择,代理模式使用,键盘的监听 )
*****HMViewController.m
#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(, 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 -;
} //让上一个field成功响应者
-(void)showProviousField:(int)currentIndex{
int proviousIndex = currentIndex - ; if (proviousIndex > ) {
UITextField *proviousTf = [_fields objectAtIndex:proviousIndex];
[proviousTf becomeFirstResponder];
} } //让下一个field成功响应者
-(void)showNextField:(int)currentIndex{
int nextIndex = currentIndex + ; //下一个索引不能超过_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
****自定义view,HMKeyboardTool.h
#import <UIKit/UIKit.h>
typedef enum {
KeyboardItemTypePrevious,//上一个
KeyboardItemTypeNext,//下一个
KeyboardItemTypeDone//完成
}KeyboardItemType;
@class HMKeyboardTool;
@protocol HMKeyboardToolDelegate <NSObject>
-(void)keyboardTool:(HMKeyboardTool *)keyboardTool didClickItemType:(KeyboardItemType)itemType;
@end
@interface HMKeyboardTool : UIView
//添加代理
@property(nonatomic,weak)id<HMKeyboardToolDelegate> delgate;
+(instancetype)keyboardTool;
@end
****自定义HMKeyboardTool.m
#import "HMKeyboardTool.h" @interface HMKeyboardTool() - (IBAction)previous:(id)sender; - (IBAction)next:(id)sender;
- (IBAction)done:(id)sender; @end @implementation HMKeyboardTool +(instancetype)keyboardTool{
return [[[NSBundle mainBundle] loadNibNamed:@"HMKeyboardTool" owner:nil options:nil] lastObject];
} //上一个
- (IBAction)previous:(id)sender { //判断代理有没有实现相应的方法
if ([self.delgate respondsToSelector:@selector(keyboardTool:didClickItemType:)]) {
[self.delgate keyboardTool:self didClickItemType:KeyboardItemTypePrevious];
}
} //下一个
- (IBAction)next:(id)sender {
//判断代理有没有实现相应的方法
if ([self.delgate respondsToSelector:@selector(keyboardTool:didClickItemType:)]) {
[self.delgate keyboardTool:self didClickItemType:KeyboardItemTypeNext];
} } //完成
- (IBAction)done:(id)sender { //判断代理有没有实现相应的方法
if ([self.delgate respondsToSelector:@selector(keyboardTool:didClickItemType:)]) {
[self.delgate keyboardTool:self didClickItemType:KeyboardItemTypeDone];
}
}
@end
IOS第12天(4,作业弹出键盘上加上(xib)view的处理,时间选择,代理模式使用,键盘的监听 )的更多相关文章
- ios手机弹出层上表单的操作,收起键盘焦点错乱的问题
今天遇到了ios手机下 弹出层上form表单 当收起键盘后,焦点错乱,无法再操作的问题 解决办法 function device() { const u = navigator.userAgent; ...
- 【土旦】vue 解决ios H5底部输入框 获取焦点时弹出虚拟键盘挡住输入框 以及监听键盘收起事件
问题描述 im聊天H5页面,在iOS系统下,inpu获取焦点弹出系统虚拟键盘时,会出现挡住input的情况,十分影响用户体验. bug图 解决方法: html: <input type=&quo ...
- QMessageBox 弹出框上的按钮设置为中文
Qt 默认的弹出框上的按钮式英文,虽然也知道是什么意思,但终究不如中文看着顺眼. QMessageBox box(QMessageBox::Warning,"标题","弹 ...
- 练习PopupWindow弹出框之实现界面加载的时候显示弹出框到指定的view下面--两种延迟方法
今天在练习PopupWindow弹出框的时候,打算在界面加载的时候将弹出框展现出来并显示在指定的view下面. 初步方法是直接在OnResume方法里面直接执行showPopupWindows方法. ...
- iOS bug 之 H5 页面没有弹出提示框
描述:在安卓上有提示框,但是在iOS上没有提示框. step 1: 失误,是我没有在正确的位置设置网址. step 2: 修改之后,测试页能弹出提示框,但是正式的页面没有提示框. step 3: 我输 ...
- iOS如何禁用长按页面弹出菜单
iOS如何禁止用户长按页面导致弹出菜单? 给元素设置样式: -webkit-touch-callout:none; 补充:同样适用于图片如果想禁止用户保存或者复制等
- iOS开发——UI篇&下拉弹出列表选择项效果
下拉弹出列表选择项效果 右边菜单中的按键,点击弹出一个列表可选择,选择其中一个,响应相应的事件并把文字显示在右边的菜单上:弹出下拉效果使用LMDropdownView插件,可以用POD进行加载pod ...
- iOS开发 编辑框被系统弹出的软键盘遮挡问题
我们在开发注冊界面的时候,最后几个注冊条件经常easy被系统弹出的键盘遮挡,例如以下图: 能够看见,邮箱条件被遮挡掉了,怎么解决呢?我是通过UITextField的代理加计算偏移量: - (void) ...
- iOS开发- 自己主动消失的弹出框
- (void)timerFireMethod:(NSTimer*)theTimer//弹出框 { UIAlertView *promptAlert = (UIAlertView*)[theTimer ...
随机推荐
- poj2385 dp(递推)
题目链接 :http://bak3.vjudge.net/contest/136499#problem/D 题意: //转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1] ...
- HTML DOM学习之一
1.HTML DOM定义了访问和操作HTML文档的标准方法:DOM以树型结构表达了HTML文档: 2.DOM是W3C的标准,定义了访问HTML和XML文档的标准: DOM(文档对象模型)是中立于平台和 ...
- Xamarin.iOS编译出错
Xamarin.iOS编译出错 错误信息:C:/Program Files(x86)/Reference Assemblies/Microsoft/Framework/Xamarin.iOS/v1.0 ...
- 为什么下载APP,扫描二维码,关注微信公众号,就会送牛奶送小礼品?下载使用量高,会怎样?
以前的老办法是到处贴广告,电视上,广播上各种宣传. 在互联网时代,企业要盈利,除了不断优化升级自己的产品和服务,大量推广宣传产品,还要懂得用户思维.现在有网站,有APP,有微信,有二维码,可以卖产品, ...
- Redis执行Lua脚本示例
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在red ...
- spark 部署问题
spark的web UI 端口设置:spark-env.sh 中设置SPARK_MASTER_WEBUI_PORT 为自己想设置的端口号. 其他worker 的web UI 端口默认:8081 mas ...
- Codeforces 615C Running Track(DP + Trie树)
题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串. UVa1401,一个道理..dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移. ...
- 编程之路 - 写给打算进入IT行业的新人们
IT=挨踢,这是IT人的自嘲,进入IT行业是有四五年了,也算得上是一个“老人”了吧,见了不少新人,面试了不少新人,也带了一些新人,多多少少还是有点发言权的. 关于书本 新人们常常会说我看了多少多少的书 ...
- BZOJ3562 : [SHOI2014]神奇化合物
可以发现,从头到尾有一堆点是始终连在一起的,所以把没被删掉的一开始就有的边都加上后求出每个联通块, 缩完点后我们发现,边数也减少得差不多了,剩下的就直接暴力. #include<cstdio&g ...
- Google Chrome开发者工具
Google Chrome开发者工具 是内嵌到浏览器的开发工具,打开方式有两种:第一“按F12”,第二:shift+ctrl+i(火狐.360等浏览器也可以这么用) Console介绍 Console ...