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

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

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


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


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


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


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


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


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


image.png


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


//整体文本控件的高度

   @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!

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


   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

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


//键盘将要展示时触发的方法

   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()

       }

   }

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


@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后可用

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


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已经改变

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


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()

           })

       }

   }

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

image.png

 

目录
相关文章
|
iOS开发
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
497 9
Cisco Catalyst 9800 Wireless Controller, IOS XE Release 17.17.1 ED - 思科无线控制器系统软件
|
9月前
|
安全 5G 语音技术
Cisco ASR 9000 Router IOS XR Release 7.11.2 MD - ASR 9000 系列聚合服务路由器系统软件
Cisco ASR 9000 Router IOS XR Release 7.11.2 MD - ASR 9000 系列聚合服务路由器系统软件
422 4
Cisco ASR 9000 Router IOS XR Release 7.11.2 MD - ASR 9000 系列聚合服务路由器系统软件
|
云安全 安全 Cloud Native
Cisco Catalyst 8000 Series IOS XE 17.18.1a ED 发布 - 思科边缘平台系列系统软件
Cisco Catalyst 8000 Series IOS XE 17.18.1a ED - 思科边缘平台系列系统软件
296 0
|
运维 监控 安全
Cisco ISR 4000 Series IOS XE 17.18.1a ED 发布 - 思科 4000 系列集成服务路由器 IOS XE 系统软件
Cisco ISR 4000 Series IOS XE 17.18.1a ED - 思科 4000 系列集成服务路由器 IOS XE 系统软件
349 0
|
人工智能 监控 安全
思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 17.18.1 ED
Cisco Catalyst 9000 Series Switches, IOS XE Release 17.18.1 ED
369 0
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
1139 21
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。