在工作之余開始自學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)在此不再描述,代碼里都有注釋,任何問題歡迎留言。
已知缺陷:第一次點擊空格按鈕,按鈕背景色不會變灰。