天天看点

设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框

    文本输入框是多数与社交相关的app中不可或缺的一个控件,这些文本输入框应该具备如下的功能:

1.在键盘为弹起时,输入框悬浮在界面底部。

2.当键盘弹起时,输入框位置上移至键盘上方,并且动画应与键盘同步。

3.当输入的文字超出一行时,输入框应想用的进行高度扩展。

4.当输入框的高度达到某一极限值时,输入框高度不应继续扩展,文字区域应该支持滑动。

    使用autolayout布局技术加上对键盘的相关监听,可以十分方便的实现上述效果。首先在xib文件中进行相关约束的添加,如下图:

设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框

将需要的属性与约束对象关联到文件中:

<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(&amp;</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>) { () -&gt; 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 &lt;= 37 {</code>

<code>            </code><code>textfieldheight.constant = 37</code>

<code>            </code><code>textviewheight.constant = 53</code>

<code>            </code><code>uiview.animatewithduration(0.3, animations: { () -&gt; 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&lt;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>

上面代码是实现可自适应高度和位置的文本输入框控件的核心代码,效果图下图:

设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框