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(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
****自定义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
没有失败, 只有放弃...