iOS自定义安全键盘

在工作之余开始自学iOS开发,接触`textField`控件时发现能够自定义键盘,于是开始仿写ICBC的安全登录键盘。起初并没有按照MVC的模式进行,在`mainStoryboard`里自定义了4个View,分别是inputAccessoryView、inputCharView(字母键盘)、inputNumberView(数字键盘)和inputSignView(符号键盘)。

设置```pwdTextField.inputAccessoryView=self.inputAccessoryView```,pwdTextField.inputView通过点击`inputAccessoryView`上的键盘类型按钮(数字、字符和符号)进行切换。存在的一个问题:每次点击“类型按钮”后都得先让`pwdTextField`放弃第一响应者,然后设置`pwdTextField`的`inputAccessoryView`和`inputView`,再让`pwdTextField`成为第一响应者。虽然这样也能够实现键盘功能,但是觉得这样做太low。

注:pwdTextField是密码输入框。

目前已实现的功能有:

◉数字键盘使用随机数字

◉记住用户名,登录时省去重新输入用户名之繁琐

◉点击头像,放大显示

◉点击头像编辑按钮,可以从相机或相册选择照片并加以保存

◉自定义Alert弹出框

◉明暗文密码切换

◉textField placeholder左右抖动

◉按下字母、符号按键,文字放大显示动画

◉密码框重新成为第一响应者时,键盘恢复成小写字符键盘

键盘演示示意图

今年5月初的时候想将之前写的安全键盘按照MVC的模式重新整理下,在梳理的过程中突然有个想法——通过点击键盘类型按钮来改变`inputCharView.leading`约束值来切换不同类型键盘。具体布局示意如下:

布局示意

约束条件如下:

约束条件
约束示意图

将`blueView.leading`通过`IBOutlet`的方式设置成NSLayoutConstraint *leftConstraint,点击红色按钮时设置`leftConstraint.constant=kScreenWidth`(屏宽),点击蓝色按钮`leftConstraint.constant=0`,点击黄色按钮`leftConstraint.constant= - kScreenWidth`。

这里遇到一个小坑:设置blueView约束条件时,起初设置`blueView.trailing=0`,点击类型按钮时一直不能切换到与之类型相对应的键盘View。将`blueView.trailing=0`修改为`blueView`与其父视图等宽即可。

字符键盘约束设置

接下来设置键盘上各个按钮的约束条件,先从相对复杂的字符键盘按钮开始。我的想法是每个按钮的宽、高设为定值,分别为30和42,按钮q距离父视图左边=0,p距离父视图右边为0,第一排各个按钮top=8,各个按钮之间的间距等宽(`Equal widths`)。设置按钮间等间距且要适应不同屏幕尺寸适配问题,我采用了一些辅助UIView进行约束设置。完成设置时将辅助的View背景色设置为透明即可。

具体步骤:

1,设置按钮q的约束条件:宽=30,高=42,上=8,左=10;

按钮q的约束条件

2,分别设置w,e,r……o,p按钮与按钮q之间的约束:等宽、等高、水平居中;

按住键盘上的Control键的同时左键鼠标选中w按钮并将其拖至按钮q上,松开鼠标按键和Control键。此时按住键盘上的shift按键依次点击“Center Vertically”,"Equal widths"和“Equal Heights”按钮,最后点击“Add Constraints”按钮。第一排的其他按钮约束条件的设置步骤同w按钮。

等宽,等高,等水平

3,设置p的约束:右=10,上=8;

4,接下来设置按钮等间距,拖拉UIView并将其放置在各个按钮中间,方便看清View将其背景色设置为红色;

添加辅助View

5,分别对添加的View设定约束(相对于左侧按钮)为水平居中、等高,另外设置View距离左右两边的按钮约束均为0;

o与p之间的View的约束

6,选中所有辅助的View,设置等宽(Equal Widths)即可完成第一排按钮的约束;

7,第二排按钮约束:a按钮左=30,上=10;I按钮右=30,上=10。其他约束条件可参考第一排按钮进行设置;

8,第三排按钮约束:shift按钮.leading=q.leading,shift按钮.trailing=a.trailing,top=10,shift按钮与q等高;z 按钮.leading=s.leading,z按钮.trailing=s.trailing,top=10,z与s等宽,其他按钮类似方式设置即可;

9,第四排按钮约束:空格按钮.leading=shift按钮.leading,空格.trailing=n.trailing,空格.top=10,空格按钮与shift按钮等高;登录按钮类似设置。

注:1,符号键盘按钮的约束条件与字符键盘按钮约束设置方法类似,此处不再赘述;

      2,在xib里我是将3个键盘View放在一个inputView下,原因是方便在控制器里设置self.pwdTextField.inputView=self.keyboardView.inputView。我自己在设计之初是想将inputView和inputAccessoryView作为一个整体赋值给pwdTextField的inputView,但是这样一来键盘显示不全,只能显示216的高度。

数字键盘按钮约束设置

要求设置数字按钮四周的间距为10(第一排按钮top设置为8),高度为42,同一排按钮等宽。

1,选中按钮1,2和3,设置左=10,上=8,右=10,高=42以及等宽,点击“Add  12 Constraints”按钮,更新约束:

约束条件设置

2,设置按钮4的左=10,上=10,右=10,按钮4与按钮1等宽、等高;按钮5和6的左、右、上都为10,分别设置按钮5、按钮6与按钮4等宽等高;

3,第三排和第四排按钮的约束条件设置方法参考步骤2即可。

到此就完成了各个键盘按钮的约束条件。

说明:本来设计时是点击“数字”按钮时,数字键盘会重新生成随机数,但是这里操作体验不好,因为能够明显看到数字重新生成的过程,故我将其处理成只要“字符”或“符号”按钮是处于选中状态,就让程序在“后台”默默地调用一次生成随机数方法,这样用户体验可能会更好。

其他功能的实现在此不再描述,代码里都有注释,任何问题欢迎留言。

已知缺陷:第一次点击空格按钮,按钮背景色不会变灰。

gitHub地址



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容