文本輸入框是多數與社交相關的app中不可或缺的一個控件,這些文本輸入框應該具備如下的功能:
1.在鍵盤為彈起時,輸入框懸浮在界面底部。
2.當鍵盤彈起時,輸入框位置上移至鍵盤上方,并且動畫應與鍵盤同步。
3.當輸入的文字超出一行時,輸入框應想用的進行高度擴充。
4.當輸入框的高度達到某一極限值時,輸入框高度不應繼續擴充,文字區域應該支援滑動。
使用autolayout布局技術加上對鍵盤的相關監聽,可以十分友善的實作上述效果。首先在xib檔案中進行相關限制的添加,如下圖:
将需要的屬性與限制對象關聯到檔案中:
<a href="http://my.oschina.net/u/2340880/blog/646202#">?</a>
1
2
3
4
5
6
7
8
9
10
<code>//整體文本控件的高度</code>
<code> </code><code>@iboutlet weak var textviewheight: nslayoutconstraint!</code>
<code> </code><code>//文本控件中的文字輸入控件uitestview的高度</code>
<code> </code><code>@iboutlet weak var textfieldheight: nslayoutconstraint!</code>
<code> </code><code>//文本控件中文字輸入控件</code>
<code> </code><code>@iboutlet weak var ourtextfield: uitextview!</code>
<code> </code><code>//文本控件與父視圖底部的限制距離</code>
<code> </code><code>@iboutlet weak var textviewbottom: nslayoutconstraint!</code>
<code> </code><code>//文本控件</code>
<code> </code><code>@iboutlet weak var ourtextview: uiview!</code>
在初始化方法中進行通知的注冊和代理的設定:
<code> </code><code>nsnotificationcenter.defaultcenter().addobserver(self, selector: selector(</code><code>"keyboardwillshow:"</code><code>), name: uikeyboardwillshownotification, object: nil)</code>
<code> </code><code>nsnotificationcenter.defaultcenter().addobserver(self, selector: selector(</code><code>"keyboardwillhidden:"</code><code>), name: uikeyboardwillhidenotification, object: nil)</code>
<code> </code><code>ourtextfield.delegate=self</code>
實作通知的監聽方法如下:
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<code> </code><code>//鍵盤将要展示時觸發的方法</code>
<code> </code><code>func keyboardwillshow(noti:nsnotification){</code>
<code> </code><code>//擷取通知資訊</code>
<code> </code><code>let info:dictionary = noti.userinfo!</code>
<code> </code><code>//擷取資訊中的鍵盤尺寸和位置資訊</code>
<code> </code><code>let value:nsvalue = info[uikeyboardframebeginuserinfokey] as! nsvalue</code>
<code> </code><code>//擷取鍵盤動畫的時間資訊</code>
<code> </code><code>let value2:nsvalue = info[uikeyboardanimationdurationuserinfokey] as! nsvalue</code>
<code> </code><code>let keyboardsize = value.cgrectvalue()</code>
<code> </code><code>let height = keyboardsize.height</code>
<code> </code><code>var </code><code>time</code><code>:nstimeinterval=0</code>
<code> </code><code>value2.getvalue(&</code><code>time</code><code>)</code>
<code> </code><code>//重設限制</code>
<code> </code><code>textviewbottom.constant = height</code>
<code> </code><code>//動畫展示</code>
<code> </code><code>uiview.animatewithduration(</code><code>time</code><code>) { () -> void in</code>
<code> </code><code>self.view.layoutifneeded()</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>//鍵盤将要隐藏時觸發的方法</code>
<code> </code><code>func keyboardwillhidden(noti:nsnotification){</code>
<code> </code><code>textviewbottom.constant = 0</code>
監聽的鍵盤狀态發送的通知中,會傳遞進來許多鍵盤資訊,可取的鍵值如下:
<code>@available(ios 3.2, *)</code>
<code>public</code> <code>let uikeyboardframebeginuserinfokey: string </code><code>//鍵盤的初始位置尺寸 為cgrect類型的nsvalue值</code>
<code>public</code> <code>let uikeyboardframeenduserinfokey: string </code><code>// 鍵盤的末位位置尺寸 為cgrect類型的nsvalue值</code>
<code>@available(ios 3.0, *)</code>
<code>public</code> <code>let uikeyboardanimationdurationuserinfokey: string </code><code>// 鍵盤動畫時間 double類型的nsvalue</code>
<code>public</code> <code>let uikeyboardanimationcurveuserinfokey: string </code><code>// 鍵盤動畫效果 (uiviewanimationcurve)枚舉類型的nsnumber值</code>
<code>@available(ios 9.0, *)</code>
<code>public</code> <code>let uikeyboardislocaluserinfokey: string </code><code>//與多任務相關 判斷鍵盤是否屬于目前應用 ios9後可用</code>
可以監聽的與鍵盤相關資訊的通知有如下幾種:
<code>public</code> <code>let uikeyboardwillshownotification: string</code><code>//鍵盤将要出現</code>
<code>public</code> <code>let uikeyboarddidshownotification: string</code><code>//鍵盤已經出現</code>
<code>public</code> <code>let uikeyboardwillhidenotification: string</code><code>//鍵盤将要隐藏</code>
<code>public</code> <code>let uikeyboarddidhidenotification: string</code><code>//鍵盤已經隐藏</code>
<code>@available(ios 5.0, *)</code>
<code>public</code> <code>let uikeyboardwillchangeframenotification: string</code><code>//鍵盤frame将要改變</code>
<code>public</code> <code>let uikeyboarddidchangeframenotification: string</code><code>//鍵盤frame已經改變</code>
還需要實作當輸入框文字長度改變時的回調方法如下:
<code>func textviewdidchange(textview: uitextview) {</code>
<code> </code><code>let height = textview.contentsize.height</code>
<code> </code><code>if</code> <code>height <= 37 {</code>
<code> </code><code>textfieldheight.constant = 37</code>
<code> </code><code>textviewheight.constant = 53</code>
<code> </code><code>uiview.animatewithduration(0.3, animations: { () -> void in</code>
<code> </code><code>self.view.layoutifneeded()</code>
<code> </code><code>})</code>
<code> </code><code>return</code>
<code> </code><code>//臨界值</code>
<code> </code><code>}</code><code>else</code> <code>if</code> <code>height<100 {</code>
<code> </code><code>textfieldheight.constant = height</code>
<code> </code><code>textviewheight.constant = height+16</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>textfieldheight.constant = 100</code>
<code> </code><code>textviewheight.constant = 116</code>
上面代碼是實作可自适應高度和位置的文本輸入框控件的核心代碼,效果圖下圖: