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

简介:

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

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

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

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
//整体文本控件的高度
     @IBOutlet weak var textViewHeight: NSLayoutConstraint!
     //文本控件中的文字输入控件UITestView的高度
     @IBOutlet weak var textFieldHeight: NSLayoutConstraint!
     //文本控件中文字输入控件
     @IBOutlet weak var ourTextField: UITextView!
     //文本控件与父视图底部的约束距离
     @IBOutlet weak var textViewBottom: NSLayoutConstraint!
     //文本控件
     @IBOutlet weak var ourTextView: UIView!

在初始化方法中进行通知的注册和代理的设置:

?
1
2
3
     NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector( "keyboardWillShow:" ), name: UIKeyboardWillShowNotification, object: nil)
     NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector( "keyboardWillHidden:" ), name: UIKeyboardWillHideNotification, object: nil)
     ourTextField.delegate=self

实现通知的监听方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  //键盘将要展示时触发的方法
     func keyboardWillShow(noti:NSNotification){
         //获取通知信息
         let info:Dictionary = noti.userInfo!
         //获取信息中的键盘尺寸和位置信息
         let value:NSValue = info[UIKeyboardFrameBeginUserInfoKey] as! NSValue
         //获取键盘动画的时间信息
         let value2:NSValue = info[UIKeyboardAnimationDurationUserInfoKey] as! NSValue
         let keyboardSize = value.CGRectValue()
         let height = keyboardSize.height
         var  time :NSTimeInterval=0
         value2.getValue(& time )
         //重设约束
         textViewBottom.constant = height
         //动画展示
         UIView.animateWithDuration( time ) { () -> Void in
             self.view.layoutIfNeeded()
         }
     }
     //键盘将要隐藏时触发的方法
     func keyboardWillHidden(noti:NSNotification){
         let info:Dictionary = noti.userInfo!
         let value2:NSValue = info[UIKeyboardAnimationDurationUserInfoKey] as! NSValue
         var  time :NSTimeInterval=0
         value2.getValue(& time )
         textViewBottom.constant = 0
         UIView.animateWithDuration( time ) { () -> Void in
             self.view.layoutIfNeeded()
         }
     }

监听的键盘状态发送的通知中,会传递进来许多键盘信息,可取的键值如下:

?
1
2
3
4
5
6
7
8
9
10
@available(iOS 3.2, *)
public  let UIKeyboardFrameBeginUserInfoKey: String  //键盘的初始位置尺寸 为CGRect类型的NSValue值
@available(iOS 3.2, *)
public  let UIKeyboardFrameEndUserInfoKey: String  // 键盘的末位位置尺寸 为CGRect类型的NSValue值
@available(iOS 3.0, *)
public  let UIKeyboardAnimationDurationUserInfoKey: String  // 键盘动画时间 double类型的NSValue
@available(iOS 3.0, *)
public  let UIKeyboardAnimationCurveUserInfoKey: String  // 键盘动画效果 (UIViewAnimationCurve)枚举类型的NSNumber值
@available(iOS 9.0, *)
public  let UIKeyboardIsLocalUserInfoKey: String  //与多任务相关 判断键盘是否属于当前应用 iOS9后可用

可以监听的与键盘相关信息的通知有如下几种:

?
1
2
3
4
5
6
7
8
public  let UIKeyboardWillShowNotification: String //键盘将要出现
public  let UIKeyboardDidShowNotification: String //键盘已经出现
public  let UIKeyboardWillHideNotification: String //键盘将要隐藏
public  let UIKeyboardDidHideNotification: String //键盘已经隐藏
@available(iOS 5.0, *)
public  let UIKeyboardWillChangeFrameNotification: String //键盘frame将要改变
@available(iOS 5.0, *)
public  let UIKeyboardDidChangeFrameNotification: String //键盘frame已经改变

还需要实现当输入框文字长度改变时的回调方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func textViewDidChange(textView: UITextView) {
         let height = textView.contentSize.height
         if  height <= 37 {
             textFieldHeight.constant = 37
             textViewHeight.constant = 53
             UIView.animateWithDuration(0.3, animations: { () -> Void in
                 self.view.layoutIfNeeded()
             })
             return
             //临界值
         } else  if  height<100 {
             textFieldHeight.constant = height
             textViewHeight.constant = height+16
             UIView.animateWithDuration(0.3, animations: { () -> Void in
                 self.view.layoutIfNeeded()
             })
         } else {
             textFieldHeight.constant = 100
             textViewHeight.constant = 116
             UIView.animateWithDuration(0.3, animations: { () -> Void in
                 self.view.layoutIfNeeded()
             })
         }
     }

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

                 


目录
相关文章
|
3月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
3月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
113 21
|
3月前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
3月前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
3月前
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
3月前
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。
|
3月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
222 2
|
4月前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
3月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
3月前
|
安全 Android开发 iOS开发
安卓系统与iOS系统的比较####
【10月更文挑战第26天】 本文将深入探讨安卓(Android)和iOS这两大主流移动操作系统的各自特点、优势与不足。通过对比分析,帮助读者更好地理解两者在用户体验、应用生态、系统安全等方面的差异,从而为消费者在选择智能手机时提供参考依据。无论你是技术爱好者还是普通用户,这篇文章都将为你揭示两大系统背后的故事和技术细节。 ####
108 0

热门文章

最新文章