iOS自定義安全鍵盤

在工作之余開始自學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;

按鈕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的高度。

數(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)在此不再描述,代碼里都有注釋,任何問題歡迎留言。

已知缺陷:第一次點擊空格按鈕,按鈕背景色不會變灰。

gitHub地址



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 很多項目中都使用自定義鍵盤,實現(xiàn)自定義鍵盤有很多方法,本文講的是修改UITextField/UITextView的...
    鏡像閱讀 1,338評論 0 6
  • 項目中可能需要用到自定義的鍵盤。學習了下找到的2款數(shù)字鍵盤。自定義鍵盤可以通過設置UITextField的inpu...
    談Xx閱讀 2,146評論 2 2
  • 創(chuàng)建Xcode項目 打開Xcode 6以上的版本并創(chuàng)建一個新項目。工程命名可以根據(jù)個人喜好命名,這里的工程命名為K...
    Coder_Vance閱讀 7,973評論 8 6
  • 來自產(chǎn)品經(jīng)理的"簡單"需求一則 需求:在輸入身份證號碼的時候,彈出來的鍵盤是能夠切換到字母的九宮格數(shù)字鍵盤。(左邊...
    伊爾今夏閱讀 10,826評論 5 33
  • //宏定義屏幕的寬和高//屏幕寬度 define kwidth self.view.frame.size.widt...
    任任任任師艷閱讀 1,061評論 0 0

友情鏈接更多精彩內容