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 ...
随机推荐
- react-router
基本的构建 import ReactRouter from 'react-router'; let {Route, Router, Link, IndexRoute} = ReactRouter.Ro ...
- vector初始化
对vector对象来说,直接初始化的方式适用于3种情况:1.初始值已知且数量少:2.初始值是另一个vector对象的副本:3.所有元素的初始值都一样.此外还有一种更常见的情况是4.创建一个vector ...
- 安装配置hive中遇到的问题
1. mysql中添加用户名时总出现如下问题:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables ...
- Visual Studio: Show Solution Platform in Toolbar
link: http://stackoverflow.com/questions/7516755/solution-configuration-but-not-platform-in-vs2010-t ...
- django 视图开发与url配置
可识别的视图需满足一下两个条件: 1.第一个参数的类型:HttpRequest 2.返回HttpResponse实例 在新建app的views当中写下以下内容 from django.shortcut ...
- BZOJ4113 : [Wf2015]Qanat
设$f_i$表示用$i$个辅助井时代价的最小值,$x_i$表示此时最后一个辅助井的位置. 则$f_i$是关于$x_i$的一个二次函数,其中系数跟$f_{i-1}$有关,递推求出极值点即可. 时间复杂度 ...
- Java 读取配置文件 Properties
String filePath="src/cn/ac/iscas/pebble/ufe/conf/id.properties"; InputStream in = new Buff ...
- Google Chrome Uncaught TypeError: object is not a function
<html> <script type="text/javascript"> function testForm(){ alert("hello ...
- Codeforces Round #246 (Div. 2) B. Football Kit
题目的意思是求出每个队穿主场衣服和客场衣服的次数 每个队作为主场的次数是n-1,作为客场的次数是n-1 当每个队打主场的时候肯定穿的主场衣服 当每个队打客场时,如果客场与主场的衣服不同,则穿客场衣服 ...
- 读书笔记:javascript高级技巧(二)
四.惰性载入函数 因为浏览器兼容的原因,我们的javascript代码会有大量的if语句,将执行引导到正确的代码中,看如下函数: function createXHR(){ if (typeof XM ...