keyInput實(shí)踐:實(shí)現(xiàn)一個(gè)iOS網(wǎng)格密碼輸入框

項(xiàng)目GitHub地址

先來(lái)兩張效果圖

<img src="http://upload-images.jianshu.io/upload_images/624048-192086ff8ed6f774.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="10%">

多行+緊貼+邊框+圓角

開(kāi)始

前幾天朋友問(wèn)我,怎么實(shí)現(xiàn)一個(gè)輸入框的效果,設(shè)計(jì)圖就是下面這張:

一個(gè)輸入框

當(dāng)時(shí)覺(jué)得挺眼熟的,很多支付APP的支付密碼就是這樣輸入的张遭。

如果總結(jié)下,就是當(dāng)你輸入比較少的內(nèi)容,而又希望整體比較美觀的話商虐,就會(huì)這樣做,因?yàn)橄到y(tǒng)的UITextField會(huì)把內(nèi)容擠在一起崖疤。

然后我就來(lái)了興致秘车,準(zhǔn)備認(rèn)真封裝下,寫(xiě)一個(gè)對(duì)于這類輸入框的通用控件劫哼。所以就有了TFGridInputView

目前的功能

  • 可以像系統(tǒng)輸入控件那樣點(diǎn)擊彈出鍵盤(pán)輸入叮趴,通過(guò)resignFirstResponder來(lái)取消輸入。

  • 可以像系統(tǒng)控件那樣通過(guò)text屬性獲取或設(shè)置文字权烧。

  • 具有密碼輸入功能眯亦,即不顯示明文

  • 支持邊框和圓角

  • 每個(gè)小框(cell)顯示一個(gè)字符,可以設(shè)置它的顯示樣式:

    • 文字顏色和字體
    • 背景色或背景圖片
  • 可以給小框的不同狀態(tài)設(shè)置不同的樣式般码,現(xiàn)在有:

    • empty: 沒(méi)有內(nèi)容時(shí)
    • fill: 填充了內(nèi)容時(shí)
    • highlight: 下一個(gè)要被輸入的cell會(huì)被認(rèn)為是highlight狀態(tài)妻率,類似于光標(biāo)的作用。

如果設(shè)置了不同的樣式板祝,那么在輸入的時(shí)候宫静,可以直觀的看到那些事輸入的、那些是沒(méi)輸入的券时,輸入位置也會(huì)比較醒目囊嘉。當(dāng)然這都是可以自由定義的,如果你不需要革为,可以把三種狀態(tài)設(shè)為一樣扭粱。

  • 輸入框的樣式也有區(qū)別,目前有兩種:
    • 一種就是每個(gè)cell是分開(kāi)的震檩,就像上面朋友給的需求那樣琢蛤。
    • 還一種是類似支付寶輸入支付密碼的樣式蜓堕,即一連串的緊貼的格子,如圖博其。
支付寶

使用

項(xiàng)目代碼里有詳細(xì)的各種例子套才,歡迎直接看代碼。這里給出一個(gè)簡(jiǎn)單示例:

//構(gòu)建一個(gè)輸入框
    _inputView = [[TFGridInputView alloc] initWithFrame:CGRectMake(30, 120, 100, 200) row:3 column:6];
    
    //構(gòu)建一個(gè)樣式慕淡,并調(diào)整各種格式
    TFGridInputViewCellStyle *style = [[TFGridInputViewCellStyle alloc] init];
    style.backColor = [UIColor colorWithWhite:0.9 alpha:1];
    style.textColor = [UIColor colorWithWhite:0.1 alpha:1];
    
    //如果各個(gè)狀態(tài)樣式一致背伴,可以只設(shè)置empty狀態(tài),它會(huì)作為缺省值使用
    [_inputView setStyle:style forState:(TFGridInputViewCellStateEmpty)];
    
    [self.view addSubview:_inputView];
    
    //設(shè)置邊框和圓角
    _inputView.DIVBorderColor = [UIColor lightGrayColor];
    _inputView.DIVBorderWidth = 0.5;
    
    //設(shè)置圓角
    _inputView.DIVCornerRadius = 5;
    
    //設(shè)置布局樣式
    _inputView.layoutStyle = TFGridInputViewLayoutStyleNoGap;
}
  • 推薦使用帶row峰髓、column的init方法構(gòu)建傻寂,這樣可以在初始化時(shí)候就把cell確定好,避免重復(fù)構(gòu)建携兵。
  • 設(shè)置cell的各種狀態(tài)需要的樣式疾掰,如果你每種狀態(tài)樣式一直,就只需要設(shè)置empty狀態(tài)即可徐紧。
  • 如果你還需要邊框或圓角静檬,也可以繼續(xù)設(shè)置。

然后就可以使用了并级,大多數(shù)的工作都是在配置樣式拂檩。

關(guān)于布局規(guī)則

構(gòu)建了一個(gè)TFGridInputView對(duì)象后,給了一個(gè)frame嘲碧,但是可能cell的寬度加上cell之間的間隙會(huì)超過(guò)frame广恢,比如寬度100,然后一行5個(gè)cell,cell寬度30呀潭,這樣cell本身就占據(jù)了150的寬度了钉迷。

對(duì)于這種情況我的處理是:
cell的大小不變,cell之間間隙使用最小值钠署,然后反過(guò)來(lái)調(diào)整父視圖的frame

比如上面的情況糠聪,如果間隙是8,那么父視圖的寬度會(huì)被擴(kuò)充為:
305 + 8(5+1) = 198谐鼎。

這么做是因?yàn)椋?/p>

  • 如果你使用的時(shí)候設(shè)置不正確舰蟆,那么我會(huì)幫你調(diào)整回來(lái),只要你的cell大小和最小間隙是你需求的那樣
  • 如果你想自己控制狸棍,那么就可以先計(jì)算好身害,把正確的cell大小和間隙傳遞過(guò)來(lái),這樣就不會(huì)發(fā)生父視圖的frame不夠的問(wèn)題草戈,我這邊就不會(huì)修改你原本的frame了塌鸯。
  • 在調(diào)整父視圖的frame后,發(fā)出通知TFGridInputViewLayoutNotification唐片,以便使用它的部分可以匹配修改

這樣既有自由度丙猬,也不會(huì)麻煩涨颜。需要的人需要,不需要的人不需要茧球。

歡迎使用庭瑰,歡迎star



2017.5.15 更新

增加長(zhǎng)按復(fù)制黏貼的功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抢埋,隨后出現(xiàn)的幾起案子弹灭,更是在濱河造成了極大的恐慌,老刑警劉巖揪垄,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穷吮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡福侈,警方通過(guò)查閱死者的電腦和手機(jī)酒来,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)卢未,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肪凛,“玉大人,你說(shuō)我怎么就攤上這事辽社∥扒剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵滴铅,是天一觀的道長(zhǎng)戳葵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汉匙,這世上最難降的妖魔是什么拱烁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮噩翠,結(jié)果婚禮上戏自,老公的妹妹穿的比我還像新娘。我一直安慰自己伤锚,他們只是感情好擅笔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著屯援,像睡著了一般猛们。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狞洋,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天弯淘,我揣著相機(jī)與錄音,去河邊找鬼吉懊。 笑死耳胎,一個(gè)胖子當(dāng)著我的面吹牛惯吕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怕午,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼废登,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了郁惜?” 一聲冷哼從身側(cè)響起堡距,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兆蕉,沒(méi)想到半個(gè)月后羽戒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虎韵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年易稠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片包蓝。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驶社,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测萎,到底是詐尸還是另有隱情亡电,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布硅瞧,位于F島的核電站份乒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腕唧。R本人自食惡果不足惜或辖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枣接。 院中可真熱鬧颂暇,春花似錦、人聲如沸月腋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榆骚。三九已至片拍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妓肢,已是汗流浹背捌省。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碉钠,地道東北人纲缓。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓卷拘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親祝高。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栗弟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件工闺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,118評(píng)論 4 61
  • 我望著你的背影出神乍赫, 為什么你帶走了我的心, 而不是我這個(gè)人陆蟆!
    簡(jiǎn)村小吹閱讀 91評(píng)論 18 8
  • 通過(guò)MaskView 來(lái)實(shí)現(xiàn)圓角功能 image 擴(kuò)展
    LeeDev閱讀 278評(píng)論 0 0
  • 我要打敗他叠殷。 王羲之好像是對(duì)諸葛夫人說(shuō)改鲫,也好像是在對(duì)自己說(shuō)。 嗯林束?逸少像棘,無(wú)論你要打敗誰(shuí),其實(shí)都不重要诊县,因?yàn)橐粋€(gè)人的...
    長(zhǎng)弓凌閱讀 226評(píng)論 0 3