重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
平常项目中有可能会遇到系统或者第三方键盘不满足于需求,我们就只能自定义键盘来满足产品的奇奇怪怪需求
创新互联专注于企业成都全网营销、网站重做改版、尧都网站定制设计、自适应品牌网站建设、H5高端网站建设、电子商务商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为尧都等各大城市提供网站开发制作服务。
如图:
1、 LAKeyboardDefine.h
2、通过设置颜色返回图片的分类 UIImage+LAColor
3、获取 UITextField 光标的分类 UITextField+LARange
在自定义键盘的时候,碰到要根据横竖屏,然后改变自定义键盘高度的需求,但是发现,无论使用autolayout还是设置frame去改变高度,都没有反应。后面经过查阅,才知道有个Intrinsic Content Size属性。可以设置视图的自定义大小。
关于 intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance的详解,参考如下博客:
下面是自己的简单记录:
改变自定义键盘的高度可以设置键盘View的视图Intrinsic Content Size属性。
先设置属性:
然后再调用方法:
大概demo如下:
//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBorderStyleBezel, UITextBorderStyleRoundedRect } UITextBorderStyle; //设置输入框的背景颜色,此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉 text.backgroundColor = [UIColor whiteColor]; //设置背景 text.background = [UIImage imageNamed:@"dd.png"]; //设置背景 text.disabledBackground = [UIImage imageNamed:@"cc.png"];//当输入框没有内容时,水印提示 提示内容为password text.placeholder = @"password"; //设置输入框内容的字体样式和大小 text.font = [UIFont fontWithName:@"Arial" size:20.0f]; //设置字体颜色 text.textColor = [UIColor redColor]; //输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容 text.clearButtonMode = UITextFieldViewModeAlways; typedef enum { UITextFieldViewModeNever, 重不出现 UITextFieldViewModeWhileEditing, 编辑时出现 UITextFieldViewModeUnlessEditing, 除了编辑外都出现 UITextFieldViewModeAlways 一直出现} UITextFieldViewMode; //输入框中一开始就有的文字 text.text = @"一开始就在输入框的文字"; //每输入一个字符就变成点 用语密码输入 text.secureTextEntry = YES; //是否纠错 text.autocorrectionType = UITextAutocorrectionTypeNo; typedef enum { UITextAutocorrectionTypeDefault, 默认 UITextAutocorrectionTypeNo, 不自动纠错 UITextAutocorrectionTypeYes, 自动纠错} UITextAutocorrectionType; //再次编辑就清空 text.clearsOnBeginEditing = YES; //内容对齐方式 text.textAlignment = UITextAlignmentLeft; //内容的垂直对齐方式 UITextField继承自UIControl,此类中有一个属性contentVerticalAlignment text.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; //设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动 textFied.adjustsFontSizeToFitWidth = YES; //设置自动缩小显示的最小字体大小 text.minimumFontSize = 20; //设置键盘的样式 text.keyboardType = UIKeyboardTypeNumberPad; typedef enum { UIKeyboardTypeDefault, 默认键盘,支持所有字符 UIKeyboardTypeASCIICapable, 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation, 标准电话键盘,支持+*#字符 UIKeyboardTypeURL, URL键盘,支持.com按钮 只支持URL字符UIKeyboardTypeNumberPad, 数字键盘UIKeyboardTypePhonePad, 电话键盘 UIKeyboardTypeNamePhonePad, 电话键盘,也支持输入人名UIKeyboardTypeEmailAddress, 用于输入电子 邮件地址的键盘 UIKeyboardTypeDecimalPad, 数字键盘 有数字和小数点 UIKeyboardTypeTwitter, 优化的键盘,方便输入@、#字符 UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, } UIKeyboardType; //首字母是否大写 text.autocapitalizationType = UITextAutocapitalizationTypeNone; typedef enum { UITextAutocapitalizationTypeNone, 不自动大写 UITextAutocapitalizationTypeWords, 单词首字母大写 UITextAutocapitalizationTypeSentences, 句子的首字母大写 UITextAutocapitalizationTypeAllCharacters, 所有字母都大写} UITextAutocapitalizationType; //return键变成什么键 text.returnKeyType =UIReturnKeyDone; typedef enum { UIReturnKeyDefault, 默认 灰色按钮,标有Return UIReturnKeyGo, 标有Go的蓝色按钮 UIReturnKeyGoogle,标有Google的蓝色按钮,用语搜索 UIReturnKeyJoin,标有Join的蓝色按钮 UIReturnKeyNext,标有Next的蓝色按钮 UIReturnKeyRoute,标有Route的蓝色按钮 UIReturnKeySearch,标有Search的蓝色按钮 UIReturnKeySend,标有Send的蓝色按钮 UIReturnKeyYahoo,标有Yahoo的蓝色按钮 UIReturnKeyYahoo,标有Yahoo的蓝色按钮 UIReturnKeyEmergencyCall, 紧急呼叫按钮} UIReturnKeyType; //键盘外观textView.keyboardAppearance=UIKeyboardAppearanceDefault;typedef enum {UIKeyboardAppearanceDefault, 默认外观,浅灰色UIKeyboardAppearanceAlert, 深灰 石墨色 } UIReturnKeyType;//设置代理 用于实现协议 text.delegate = self; //把textfield加到视图中 [self.window addSubview:text]; //最右侧加图片是以下代码 左侧类似 UIImageView *image=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]]; text.rightView=image; text.rightViewMode = UITextFieldViewModeAlways; typedef enum { UITextFieldViewModeNever, UITextFieldViewModeWhileEditing, UITextFieldViewModeUnlessEditing, UITextFieldViewModeAlways} UITextFieldViewMode;//按return键键盘往下收 becomeFirstResponder 类要采用UITextFieldDelegate协议 text.delegate = self; 声明text的代理是我,我会去实现把键盘往下收的方法 这个方法在UITextFieldDelegate里所以我们要采用UITextFieldDelegate这个协议 - (BOOL)textFieldShouldReturn:(UITextField *)textField{ [text resignFirstResponder]; //主要是[receiver resignFirstResponder]在哪调用就能把receiver对应的键盘往下收 return YES;}重写绘制行为除了UITextField对象的风格选项,你还可以定制化UITextField对象,为他添加许多不同的重写方法,来改变文本字段的显示行为。这些方法都会返回一个CGRect结构,制定了文本字段每个部件的边界范围。以下方法都可以重写。 – textRectForBounds: //重写来重置文字区域– drawTextInRect: //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.– placeholderRectForBounds://重写来重置占位符区域– drawPlaceholderInRect://重写改变绘制占位符属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数,就不用调用super了.– borderRectForBounds://重写来重置边缘区域– editingRectForBounds://重写来重置编辑区域– clearButtonRectForBounds://重写来重置clearButton位置,改变size可能导致button的图片失真– leftViewRectForBounds:– rightViewRectForBounds: 委托方法 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ //返回一个BOOL值,指定是否循序文本字段开始编辑 return YES; } - (void)textFieldDidBeginEditing:(UITextField *)textField{ //开始编辑时触发,文本字段将成为first responder } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ //返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder //要想在用户结束编辑时阻止文本字段消失,可以返回NO //这对一些文本字段必须始终保持活跃状态的程序很有用,比如即时消息 return NO; } - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ //当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。 //这对于想要加入撤销选项的应用程序特别有用 //可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。 //要防止文字被改变可以返回NO //这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中 return YES; } - (BOOL)textFieldShouldClear:(UITextField *)textField{ //返回一个BOOL值指明是否允许根据用户请求清除内容 //可以设置在特定条件下才允许清除内容 return YES; } -(BOOL)textFieldShouldReturn:(UITextField *)textField{ //返回一个BOOL值,指明是否允许在按下回车键时结束编辑 //如果允许要调用resignFirstResponder 方法,这回导致结束编辑,而键盘会被收起[textField resignFirstResponder];//查一下resign这个单词的意思就明白这个方法了 return YES; }
在iOS中使用UITextField控件时会弹出软键盘,此时默认在软键盘上方会出现一个工具条,一般默认工具条有两种样式。
可以设置info.plist文件的Localization native development region项为cn,此时运行会发现工具条的Done已经变成了完成。
本人在项目中有用到 IQKeyboardManager 来增强键盘的功能,如果使用了这个轮子,设置
此时键盘的工具条即被隐藏。
第二种方法我使用了UITextField的inputAccessoryView属性,可以给该属性设置一个高度为0的View,也可以达到隐藏键盘工具条的效果
跟隐藏工具条中的第二种方法一样,给inputAccessoryView属性设置一个自定义的View,即达到自定义效果,此处把工具条改成红色作为演示
运行效果如下:
//键盘的高度
2 我们先定义两个textField:用来接收键盘的输入值
UITextField * textfield2 = [[UITextField alloc] initWithFrame:CGRectMake(170, 240, 180, 40)];
textfield2.tag = 222;
textfield2.backgroundColor = [UIColor orangeColor];
textfield2.layer.cornerRadius = 5;
textfield2.layer.masksToBounds = YES;
textfield2.clearButtonMode = UITextFieldViewModeAlways;
[self.view addSubview:textfield2];
UITextField * textfield3 = [[UITextField alloc] initWithFrame:CGRectMake(170, 300, 100, 40)];
textfield3.tag = 223;
textfield3.placeholder = @"验证码";
textfield3.layer.cornerRadius = 5;
textfield3.layer.masksToBounds = YES;
textfield3.clearButtonMode = UITextFieldViewModeAlways;
textfield3.backgroundColor = [UIColor whiteColor];
[self.view addSubview:textfield3];
3 //键盘的辅助视图
//设置辅助视图的大小
UIView * grayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 40)];
//辅助视图的背景颜色
grayView.backgroundColor = [UIColor lightGrayColor];
//.注意!!关键给键盘设置辅助视图
textfield2.inputAccessoryView = grayView;
textfield3.inputAccessoryView = grayView;
//注意!!!!!!在这里我们用数组来接收1-9的值
NSArray * array = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"×",@"0",@"return"];
//X号操作删除最后一个字符
//return 收回键盘
NSInteger index=0;
//设置每一行走的次数
for (int i = 0; i4; i++) {
//设置每一趟走的次数
for (int j = 0; j3; j++) {
//数组按钮的颜色
button.backgroundColor = [UIColor whiteColor];
//数组按钮上的文字
[button setTitle:array[index] forState:UIControlStateNormal];
index++;//将数组的元素进行累加统计
//设置字体颜色
[button setTitleColor:[UIColor purpleColor] forState:UIControlStateNormal];
//加粗字体
button.titleLabel.font = [UIFont boldSystemFontOfSize:20];
//设置边框的颜色
button.layer.borderColor = [UIColor grayColor].CGColor;
//设置边框的宽度
button.layer.borderWidth = 3;
//设置1-9的数字方法
if (i3) {
[button addTarget:self action:@selector(b1Action:) forControlEvents:UIControlEventTouchUpInside];
}
else if(i == 3 j == 0){
//叉号 用来删除字符
[button addTarget:self action:@selector(deleteChar:) forControlEvents:UIControlEventTouchUpInside];
}
-(void)b1Action:(UIButton *)b1{
//点击当前按钮 就把按钮上的文字 拼接到输入框中
//1.获取输入框
}
-(void)deleteChar:(UIButton *)button{
}
-(void)takeBackKeyboard:(UIButton *)button{
UITextField *textField2 = (UITextField *) [self.view viewWithTag:222];
//释放第一响应者 也就是收回键盘
if (textField2.isFirstResponder == YES) {
[textField2 resignFirstResponder];}
}
效果如图:
自定义键盘属于App的扩展功能,添加扩展键盘的步骤如下:
选择自定义扩展键盘,点击Next,会自动创建一个父类是UIInputViewController 的KeyboardViewController文件。
要想app应用和扩展进行通讯,需要创建Appgroup通道,创建方法如下图所示
同样在Targets 下的 app选中也要用同样的方法创建传送通道,app和扩展才可以传递数据。
下面就是画键盘了,键盘可以用xib创建,下面就是我创建的键盘
下面就是监听button点击,进行大小写切换,删除输入等功能。
大小写切换可以自定义一个方法,然后根据传入的是否大写或者小写,返回数组内容,重新给button赋值
监听内容输入到输入框,系统有自己的方法。
"[weakSelf.textDocumentProxyinsertText:content];”
就可以进行监听输入的内容了