【iOS自定义键盘】详解
实现效果展示:
一、实现的协议方法代码
1 #import <UIKit/UIKit.h> 2 3 //创建自定义键盘协议 4 @protocol XFG_KeyBoardDelegate <NSObject> 5 //创建协议方法 6 @required//必须执行的方法 7 - (void)numberKeyBoard:(NSInteger) number; 8 - (void)cancelKeyBoard; 9 - (void)finishKeyBoard; 10 - (void)periodKeyBoard; 11 - (void)changeKeyBoard; 12 @optional//不必须执行方法 13 14 @end 15 16 17 @interface XFG_KeyBoard : UIView 18 { 19 @private//私有的协议方法 20 id<XFG_KeyBoardDelegate> _delegate; 21 } 22 23 @property (nonatomic, strong) id<XFG_KeyBoardDelegate> delegate; 24 25 - (id)initWithNumber:(NSNumber *)number; 26 @end
二、自定义键盘创建
1 #import "XFG_KeyBoard.h" 2 #define kScreenWidth [UIScreen mainScreen].bounds.size.width 3 #define kScreenHeight [UIScreen mainScreen].bounds.size.height 4 5 @implementation XFG_KeyBoard 6 7 8 - (id)initWithNumber:(NSNumber *)number 9 { 10 self = [super init]; 11 if (self) { 12 13 self.backgroundColor = [UIColor greenColor]; 14 self.frame = CGRectMake(0, kScreenHeight - 150, kScreenHeight, 150); 15 if ([number isEqualToNumber:@1]) { 16 17 [self initKeyBoardNumber_1]; 18 } else if ([number isEqualToNumber:@2]){ 19 20 [self initKeyBoardNumber_2]; 21 } else if ([number isEqualToNumber:@3]){ 22 23 [self initKeyBoardNumber_3]; 24 } 25 } 26 27 return self; 28 } 29 30 #pragma 键盘1自定义视图 31 - (void)initKeyBoardNumber_1 32 { 33 self.frame=CGRectMake(0, kScreenHeight-243, kScreenWidth, 243); 34 int space=1; 35 for (int i=0; i<9; i++) { 36 NSString *str=[NSString stringWithFormat:@"%d",i+1]; 37 UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem]; 38 if (i<3) { 39 button.frame=CGRectMake(i%3*(kScreenWidth/4)+space, i/3*61, kScreenWidth/4-1, 60); 40 } 41 else{ 42 button.frame=CGRectMake(i%3*(kScreenWidth/4)+space, i/3*60+i/3*space, kScreenWidth/4-1, 60); 43 } 44 button.backgroundColor=[UIColor whiteColor]; 45 [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 46 button.titleLabel.font=[UIFont systemFontOfSize:24]; 47 [button setTitle:str forState:UIControlStateNormal]; 48 button.tag=i+1; 49 [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 50 [self addSubview:button]; 51 } 52 UIButton *dian=[UIButton buttonWithType:UIButtonTypeSystem]; 53 dian.frame=CGRectMake(space,60*3+3 , kScreenWidth/4-1, 60); 54 dian.backgroundColor=[UIColor whiteColor]; 55 [dian setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 56 dian.titleLabel.font=[UIFont systemFontOfSize:24]; 57 [dian addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 58 [dian setTitle:@"." forState:UIControlStateNormal]; 59 dian.tag=11; 60 [self addSubview:dian]; 61 UIButton *ling=[UIButton buttonWithType:UIButtonTypeSystem]; 62 ling.frame=CGRectMake(kScreenWidth/4+1*space,60*3+3, kScreenWidth/4-1, 60); 63 ling.backgroundColor=[UIColor whiteColor]; 64 [ling setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 65 ling.titleLabel.font=[UIFont systemFontOfSize:24]; 66 [ling setTitle:@"0" forState:UIControlStateNormal]; 67 ling.tag=0; 68 [ling addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 69 [self addSubview:ling]; 70 71 UIButton *computer=[UIButton buttonWithType:UIButtonTypeSystem]; 72 computer.frame=CGRectMake(kScreenWidth/4*2+space,60*3+3, kScreenWidth/4-1, 60); 73 computer.backgroundColor=[UIColor whiteColor]; 74 [computer setTitle:@"系统键盘" forState:UIControlStateNormal]; 75 computer.tag=12; 76 [computer addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 77 [self addSubview:computer]; 78 79 UIButton *delete=[UIButton buttonWithType:UIButtonTypeSystem]; 80 delete.frame=CGRectMake(kScreenWidth/4*3+space,1, kScreenWidth/4-1, 122); 81 [delete addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 82 delete.tag=10; 83 84 UIImageView *deleteImage=[[UIImageView alloc]initWithFrame:CGRectMake((kScreenWidth/4-1 - 28) * 1.0 / 2, 50, 28, 20)]; 85 deleteImage.image=[UIImage imageNamed:@"goumai_03"]; 86 [delete addSubview:deleteImage]; 87 88 // [delete setBackgroundImage:[UIImage imageNamed:@"goumai_03"] forState:UIControlStateNormal]; 89 [self addSubview:delete]; 90 91 UIButton *confirm=[UIButton buttonWithType:UIButtonTypeSystem]; 92 confirm.frame=CGRectMake(kScreenWidth/4*3+space,61*2, kScreenWidth/4-1, 122); 93 confirm.backgroundColor=[UIColor blueColor]; 94 [confirm setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 95 confirm.titleLabel.font=[UIFont systemFontOfSize:20]; 96 [confirm setTitle:@"确 定" forState:UIControlStateNormal]; 97 [confirm addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 98 confirm.tag=13; 99 [self addSubview:confirm]; 100 } 101 102 #pragma 键盘2自定义视图 103 - (void)initKeyBoardNumber_2 104 { 105 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 150, 150)]; 106 107 button.backgroundColor = [UIColor grayColor]; 108 button.titleLabel.font = [UIFont systemFontOfSize:100]; 109 [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 110 [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 111 [self addSubview:button]; 112 button.tag = 2; 113 [button setTitle:@"2" forState:UIControlStateNormal]; 114 115 UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, 0, 150, 150)]; 116 117 cancel.backgroundColor = [UIColor yellowColor]; 118 cancel.titleLabel.font = [UIFont systemFontOfSize:33]; 119 [cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 120 [cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 121 [self addSubview:cancel]; 122 cancel.tag = 10; 123 [cancel setTitle:@"删 除" forState:UIControlStateNormal]; 124 } 125 126 #pragma 键盘3自定义视图 127 - (void)initKeyBoardNumber_3 128 { 129 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 150, 150)]; 130 131 button.backgroundColor = [UIColor purpleColor]; 132 button.titleLabel.font = [UIFont systemFontOfSize:100]; 133 [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 134 [button addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 135 [self addSubview:button]; 136 button.tag = 3; 137 [button setTitle:@"3" forState:UIControlStateNormal]; 138 139 UIButton *cancel = [[UIButton alloc] initWithFrame:CGRectMake(button.bounds.origin.x + button.bounds.size.width, 0, 150, 150)]; 140 141 cancel.backgroundColor = [UIColor yellowColor]; 142 cancel.titleLabel.font = [UIFont systemFontOfSize:33]; 143 [cancel setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 144 [cancel addTarget:self action:@selector(keyBoardAciont:) forControlEvents:UIControlEventTouchUpInside]; 145 [self addSubview:cancel]; 146 cancel.tag = 10; 147 [cancel setTitle:@"删 除" forState:UIControlStateNormal]; 148 } 149 150 #pragma 键盘点击按钮事件 151 - (void)keyBoardAciont:(UIButton *)sender 152 { 153 154 UIButton* btn = (UIButton*)sender; 155 156 NSInteger number = btn.tag; 157 158 // no delegate, print log info 159 if (nil == _delegate) { 160 NSLog(@"button tag [%ld]",(long)number); 161 return; 162 } 163 164 if (number <= 9 && number >= 0) { 165 [_delegate numberKeyBoard:number]; 166 return; 167 } 168 169 if (10 == number) { 170 [_delegate cancelKeyBoard]; 171 return; 172 } 173 if (11 == number) { 174 [_delegate periodKeyBoard]; 175 return; 176 } 177 if (12 == number) { 178 [_delegate changeKeyBoard]; 179 return; 180 } 181 182 if (13 == number) { 183 [_delegate finishKeyBoard]; 184 return; 185 } 186 187 } 188 189 @end
三、自定义键盘运用
1 #import "ViewController.h" 2 #import "XFG_KeyBoard.h" 3 #define kScreenWidth [UIScreen mainScreen].bounds.size.width 4 #define kScreenHeight [UIScreen mainScreen].bounds.size.height 5 6 7 @interface ViewController ()<UITextFieldDelegate, XFG_KeyBoardDelegate> 8 9 @property (nonatomic, strong) XFG_KeyBoard *xfg_keyboard; 10 @property (nonatomic, strong) UITextField *textField; 11 @end 12 13 @implementation ViewController 14 15 - (void)viewDidLoad { 16 [super viewDidLoad]; 17 // Do any additional setup after loading the view, typically from a nib. 18 self.title = @"小飞哥键盘"; 19 self.textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 168, kScreenWidth - 100, 50)]; 20 self.textField.delegate = self; 21 self.textField.backgroundColor = [UIColor greenColor]; 22 self.textField.placeholder = @"(默认系统键盘)"; 23 24 [self.view addSubview:self.textField]; 25 26 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hidenKeyBoard)]; 27 [self.view addGestureRecognizer:tap]; 28 29 UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:@[@"键盘1",@"键盘2",@"键盘3",@"系统键盘"]]; 30 segment.frame = CGRectMake(0, 100, kScreenWidth, 50); 31 [segment addTarget:self action:@selector(keyBoardTypeAction:) forControlEvents:UIControlEventValueChanged]; 32 [self.view addSubview:segment]; 33 34 } 35 36 - (void)keyBoardTypeAction:(id )sender 37 { 38 UISegmentedControl *seg = (UISegmentedControl *)sender; 39 NSLog(@"intage = %ld", (long)seg.selectedSegmentIndex); 40 41 if (seg.selectedSegmentIndex == 0) { 42 self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@1]; 43 self.textField.inputView = self.xfg_keyboard; 44 self.xfg_keyboard.delegate = self; 45 [self.textField reloadInputViews]; 46 } 47 if (seg.selectedSegmentIndex == 1) { 48 self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@2]; 49 self.textField.inputView = self.xfg_keyboard; 50 self.xfg_keyboard.delegate = self; 51 [self.textField reloadInputViews]; 52 53 } 54 55 if (seg.selectedSegmentIndex == 2) { 56 self.xfg_keyboard = [[XFG_KeyBoard alloc] initWithNumber:@3]; 57 self.textField.inputView = self.xfg_keyboard; 58 self.xfg_keyboard.delegate = self; 59 [self.textField reloadInputViews]; 60 } 61 62 if (seg.selectedSegmentIndex == 3) { 63 self.textField.inputView = nil; 64 [self.textField reloadInputViews]; 65 } 66 67 } 68 69 - (void)hidenKeyBoard 70 { 71 NSLog(@"键盘隐藏"); 72 [self.textField resignFirstResponder]; 73 } 74 75 - (void)textFieldDidBeginEditing:(UITextField *)textField 76 { 77 NSLog(@"显示键盘"); 78 } 79 80 - (void)numberKeyBoard:(NSInteger)number 81 { 82 NSString *str = self.textField.text; 83 self.textField.text = [NSString stringWithFormat:@"%@%ld",str,(long)number]; 84 } 85 86 - (void)cancelKeyBoard 87 { 88 89 NSMutableString *muStr = [[NSMutableString alloc] initWithString:self.textField.text]; 90 if (muStr.length <= 0) { 91 return; 92 } 93 [muStr deleteCharactersInRange:NSMakeRange([muStr length] - 1, 1)]; 94 self.textField.text = muStr; 95 } 96 97 #pragma 输入点 98 -(void)periodKeyBoard{ 99 100 if ([self.textField.text isEqualToString:@""]) { 101 return; 102 } 103 104 //判断当前时候存在一个点 105 if ([self.textField.text rangeOfString:@"."].location == NSNotFound) { 106 //输入中没有点 107 NSMutableString *mutableString=[[NSMutableString alloc]initWithFormat:@"%@%@",self.textField.text,@"."]; 108 self.textField.text=mutableString; 109 } 110 } 111 112 -(void)changeKeyBoard{ 113 114 self.textField.inputView = nil; 115 [self.textField reloadInputViews]; 116 } 117 118 -(void)finishKeyBoard{ 119 [self.view endEditing:YES]; 120 } 121 122 - (void)didReceiveMemoryWarning { 123 [super didReceiveMemoryWarning]; 124 // Dispose of any resources that can be recreated. 125 } 126 127 @end