iOS自定义键盘

来源:互联网 发布:淘宝心愿单是什么 编辑:程序博客网 时间:2024/06/05 09:53

我公司主营项目就是安全键盘,也有源代码可供我看(源代码我就没看完过),想自己写一个自定义键盘的起因是我的一个朋友,恰巧他们公司要求做一个自定义键盘,然后他美滋滋告诉我一周就搞定了,然后我。。就也想弄一个试试,(朋友是大神级别,就算不是大神也是写代码比较厉害的主,博主是技术一般般的菜鸟),so......开始敲自定义键盘代码。

这篇文章是一边写代码一边写文章,本意是记录遇到的问题,随时遇到随时记录。不然写完了,有遇到的问题忘记了就麻烦了

刚开始写的时候不清楚如何下手,然后百度了下看到是需要重写inputview,然后开始敲起来。。。。。。。。。

刚开始继承的是UIview,然后朋友说有uiinptview,然后就改为uiinptview(好没主见!!!但毕竟人家是大神嘛)。好~~~ 开始写!想着键盘有数字、字母、字符,然后看到uiinptview有枚举,然后就想着用枚举来分键盘类型。

typedef NS_ENUM(NSInteger, KeyboardType){    KeyboardTypeDefault,    KeyboardTypeNumber,    KeyboardTypeNumbersAndPunctuation};

-(instancetype)initWithFrame:(CGRect)frame keyboardType:(KeyboardType)type;

写个枚举与init方法,跟上个键盘type。在init方法里用if来判断键盘类型,if(数字)//代码    else if (字母)..........就不过多记录了。

数字键盘UI很好搭建,直接for循环,下面是按钮的点击事件

-(void)mapBtnClick:(UIButton *)sender{    NSLog(@"%ld", (long)sender.tag);    NSString *tit = [sender.titleLabel text];    UITextField *tf = (UITextField *)self.inputSource;    tf.text = [NSString stringWithFormat:@"%@%@", tf.text, tit];}
这里的self.inputSource是input的类型,毕竟调用键盘的有UItextfield,UItextview,uisearch等,这样可以做些相应的修改。

字母键盘,单单是UI,我就搭建了好久,主要是适配问题!本人逻辑不是很强,在里面绕了一会!但也是顺利搞定。完成后先弄的是shift大小写切换,在这个上面吧逗留了一下午,吧字母存数组,存字典,字母tag一起存,弄了好久都不行,最后看到了uppercaseString与lowercaseString!大小写转换的。顿时看到了希望,然后在shift点击事件里面开始写,卡壳了,我怎么拿到按钮,拿不到按钮就拿不到tag值,拿不到怎么转换与显示呢。第一想到是直接把按钮弄成全局变量,然后btn.tag就能出来了,但是事与愿违,写完后点击shift只改变了最后一个字母,那就是M字母。想不到为什么,网上查了下,使用全局的,最终只能拿到你所设置的最后一个tag值,也就是M。就比如你的按钮点击事件是-(void)btnaction:(uibutton*)sender, 拿tag值只能sender.tag,若用self.btn.tag拿到的是你所设置的最后一个tag值。知道问题就开始解决,吧按钮存数组里,使用的时候遍历一遍,拿出来用就行,OK,存起来,实现了大小写切换,上代码

-(void)shiftBtn:(UIButton *)sender{        self.shiftEnable = !self.shiftEnable;        [sender setTitle:self.shiftEnable?@"▽":@"△" forState:UIControlStateNormal];        [self.ABCmutArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {        UIButton *btn1 = (UIButton *)obj;        NSString *tmp = [Characters objectAtIndex:btn1.tag];        NSString *tmp2 = self.shiftEnable?[tmp uppercaseString]:[tmp lowercaseString];        [btn1 setTitle:tmp2 forState:UIControlStateNormal];    }];
这个是shift的点击事件。self.ABCmutArr是存按钮的可变数组,Characters是一个数组,存的qwertyuiop等等字母,使用了三目运算符,最终搞定!当然也可以用按钮的Selected来做,逻辑差不多。

当然了,字母键盘的点击事件也和数字键盘的差不多

-(void)keyboardBtnClick:(UIButton *)sender{    NSLog(@"点击");        NSString *Btntitle = [sender titleLabel].text;        if (self.inputSource) {        if ([self.inputSource isKindOfClass:[UITextField class]]) {                        UITextField *tf = (UITextField *)self.inputSource;            tf.text = [NSString stringWithFormat:@"%@%@", tf.text, Btntitle];        }    }    }
删除的点击事件

-(void)deleteClick{        NSLog(@"删除");    if (self.inputSource) {        if ([self.inputSource isKindOfClass:[UITextField class]]) {            UITextField *tf = (UITextField *)self.inputSource;            [tf deleteBackward];        }    }}
删除按钮的点击事件开始真不知道怎么写,后来。。嘿嘿!一句话就能搞定

然后是字母,字符切换的点击事件

-(void)characterClick:(UIButton *)btn{        self.showSymbol = !self.showSymbol;    NSString *chara = self.showSymbol?@"ABC":@"#+123";    [character setTitle:chara forState:UIControlStateNormal];    [self setupdataChars:false];}
-(void)setupdataChars:(BOOL)init;初始化键盘。我在init方法里定义的是bool,来区分是字母键盘或是字符键盘

 if (!init) {        NSArray *subView = self.subviews;        [subView enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {                       if ([obj isKindOfClass:[UIButton class]]) {                [obj removeFromSuperview];            }        }];    }        if (_ABCmutArr) {                [_ABCmutArr removeAllObjects];        _ABCmutArr = nil;    }        self.ABCmutArr = [[NSMutableArray alloc]initWithCapacity:0];        NSArray *charsArr;    NSArray *rangs;    if (!self.showSymbol) {                charsArr = Characters;        rangs = @[@10, @19, @26];//字母三排的个数    }else{        charsArr = self.showMoreSymbol?Characters:Symbols;        rangs = @[@10, @20, @25];//字符三排的个数    }
判断init,当切换到字符时,remove按钮,self.ABCmutarr为存按钮的数组,也清空。用两个数组来保存“qwerttyu”与“1234()_+”,当bool值不同,就会切换字母与字符键盘,虽然写了键盘有三个类型,但是调用目前只有纯数字与字母。

还有很多的坑没填上,功能没完善,暂时先这样吧!作者意为记录。


原创粉丝点击