在工作之余開始自學iOS開發(fā),接觸`textField`控件時發(fā)現(xiàn)能夠自定義鍵盤瘸恼,于是開始仿寫ICBC的安全登錄鍵盤劣挫。起初并沒有按照MVC的模式進行,在`mainStoryboard`里自定義了4個View东帅,分別是inputAccessoryView压固、inputCharView(字母鍵盤)、inputNumberView(數(shù)字鍵盤)和inputSignView(符號鍵盤)靠闭。
設置```pwdTextField.inputAccessoryView=self.inputAccessoryView```帐我,pwdTextField.inputView通過點擊`inputAccessoryView`上的鍵盤類型按鈕(數(shù)字、字符和符號)進行切換阎毅。存在的一個問題:每次點擊“類型按鈕”后都得先讓`pwdTextField`放棄第一響應者焚刚,然后設置`pwdTextField`的`inputAccessoryView`和`inputView`点弯,再讓`pwdTextField`成為第一響應者扇调。雖然這樣也能夠實現(xiàn)鍵盤功能,但是覺得這樣做太low抢肛。
注:pwdTextField是密碼輸入框狼钮。
目前已實現(xiàn)的功能有:
?數(shù)字鍵盤使用隨機數(shù)字
?記住用戶名,登錄時省去重新輸入用戶名之繁瑣
?點擊頭像捡絮,放大顯示
?點擊頭像編輯按鈕熬芜,可以從相機或相冊選擇照片并加以保存
?自定義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教寂;
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將其背景色設置為紅色旬陡;
5拓颓,分別對添加的View設定約束(相對于左側按鈕)為水平居中、等高描孟,另外設置View距離左右兩邊的按鈕約束均為0驶睦;
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的高度。
數(shù)字鍵盤按鈕約束設置
要求設置數(shù)字按鈕四周的間距為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即可博个。
到此就完成了各個鍵盤按鈕的約束條件。
說明:本來設計時是點擊“數(shù)字”按鈕時功偿,數(shù)字鍵盤會重新生成隨機數(shù)盆佣,但是這里操作體驗不好,因為能夠明顯看到數(shù)字重新生成的過程械荷,故我將其處理成只要“字符”或“符號”按鈕是處于選中狀態(tài)共耍,就讓程序在“后臺”默默地調用一次生成隨機數(shù)方法,這樣用戶體驗可能會更好吨瞎。
其他功能的實現(xiàn)在此不再描述痹兜,代碼里都有注釋,任何問題歡迎留言颤诀。
已知缺陷:第一次點擊空格按鈕字旭,按鈕背景色不會變灰。