【UIKit】文本框(UITextField)及键盘遮挡处理和回收
文本框(UITextField)及键盘遮挡处理和回收
文本框属性
官网文档:UITextField Class Reference
以下都是可以在IB中选择设置的,也可以使用代码编写
placeholder :文本提示、提示符【placeholder:占位符】
aligment:对其方式
clear Button:清除按钮
键盘选项
default//默认键盘(没有特殊要求就选它)
keyboardeType:弹出键盘类型(自动的),列举几个陌生的NumbersAndPunctuation//数字和符号键盘
decimal Pad//带小数点的键盘
TypeTwitter//优化的键盘,方便输入@、#等特殊自符
其他若干中键盘方式
capitalization:输入框首字母是否大写
返回健有多种选项:其中emergency call为紧急呼叫
secure Text Entry:输入的字符影藏(像密码框一样)
swift版本编码方式创建文本框:文本框的基本使用
文本框代理和通知
官方文档:UItextFieldDelegateprotocol Reference
文本框代理:
public protocol UITextFieldDelegate : NSObjectProtocol {@available(iOS 2.0, *)optional public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool // return NO to disallow editing.@available(iOS 2.0, *)optional public func textFieldDidBeginEditing(_ textField: UITextField) // became first responder@available(iOS 2.0, *)optional public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end@available(iOS 2.0, *)optional public func textFieldDidEndEditing(_ textField: UITextField) // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called@available(iOS 10.0, *)optional public func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) // if implemented, called in place of textFieldDidEndEditing:@available(iOS 2.0, *)optional public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool // return NO to not change text@available(iOS 2.0, *)optional public func textFieldShouldClear(_ textField: UITextField) -> Bool // called when clear button pressed. return NO to ignore (no notifications) //清除按钮点击时调用 ,返回NO则忽略清除@available(iOS 2.0, *)optional public func textFieldShouldReturn(_ textField: UITextField) -> Bool // called when 'return' key pressed. return NO to ignore. //返回按钮被点击时,调用,返回true时会自动收起键盘
}
通知监听
文本框的开始和结束编辑,以及文本改变都是通过系统发出通知的。
通知如下:
extension NSNotification.Name {public static let UITextFieldTextDidBeginEditing: NSNotification.Namepublic static let UITextFieldTextDidEndEditing: NSNotification.Namepublic static let UITextFieldTextDidChange: NSNotification.Name
}
可以在该页面监听通知,然后做出处理函数(比如在其中检查某些字段的合法性),
代码如下:
1。首先,注册通知(注意通知的名字是系统定义的,是系统发出的通知)
NotificationCenter.default.addObserver(self, selector: #selector(checkThePhoneNum), name:.UITextFieldTextDidChange, object: nil)
2.实现检查函数
//电话号码检查func checkThePhoneNum(sender:Notification) -> Void {phoneNumber = self.phoneNum.text!let str = phoneNumber as NSStringif str.length>11 {MBProgressHUD.failtureHUD(message: "电话超过11位", to: self.view)}}
3.取消通知注册
deinit {NotificationCenter.default.removeObserver(self)}
键盘回收
实现键盘回收,只需要在文本返回(textFieldShouldReturn)方法取消文本框(.resignFirstResponder())的第一响应
通用方法:在上一个视图中添加手势,在手势的Action函数中取消掉相应的文本框的第一相应。
提示:如果遇到模拟器点击文本框时不能显示键盘,在模拟器设置Hardware->KeyBoard->取消Connect hardwarekeyboard
键盘遮挡问题处理
针对文本输入框/视图,编辑时就会调用键盘,如果输入框在屏幕下方很有可能被弹出的键盘给遮挡住。
解决思想:根据是否遮挡输入框,对整个keyWindow是上移,从而避免遮挡,当然,还得使用通知。
具体代码实现(Object-C)
//ll键盘通知【learn】[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(showKeyboard:) name:UIKeyboardWillShowNotification object:nil]; //调用键盘时通知处理 <pre name="code" class="objc"> [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(hideKeyboard:) name:UIKeyboardWillHideNotification object:nil];//键盘回收通知处理
<pre name="code" class="objc">//ll获取通知中心的信息,键盘出现的时候
-(void) showKeyboard:(NSNotification*) noti{NSDictionary *info = [noti userInfo];NSValue *value = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];NSLog(@"输出以下这个集合看看有些什么:%i");for (NSString *key in info) {//集合的遍历NSLog(@"%@:%@",key,[info objectForKey:key]);}CGRect arect = [value CGRectValue];//注意基本数据不用*_height = arect.size.height;NSLog(@"键盘的高度:%f",self.height);
//思想:通过移动整个UIWindou//1.获取文本框的相对位置CGPoint relationPoint = [self.inputView convertPoint:CGPointZero toView:[UIApplication sharedApplication].keyWindow];//2.计算活动面积高度CGFloat actualHeight = CGRectGetHeight(self.inputView.frame) + relationPoint.y + self.height ;//3.判断是否会发生键盘遮挡问题CGFloat overstep = actualHeight - [UIScreen mainScreen].bounds.size.height;if (overstep>0) {//需要移动CGRect frame = [UIScreen mainScreen].bounds;frame.origin.y -= overstep; //[learn】主屏幕往上移动,初始坐标的y值是负的//获取屏幕方向CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];//好好研读LL[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{//4.调整视图[UIApplication sharedApplication].keyWindow.frame = frame;} completion:nil];}
//键盘回收处理,上移部分恢复,
-(void) hideKeyboard: (NSNotification*) noti{CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];CGRect frame = [UIScreen mainScreen].bounds;[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{NSLog(@"即将回收见盘");[UIApplication sharedApplication].keyWindow.frame = frame;} completion:nil];}
提示:使用以上代码无法回收键盘?不知道为什么,调用resignFirstspoder总是返回NO值。希望知道的大神评论区告知原因。
UITextField的其他知识:自定义限制输入
【UIKit】文本框(UITextField)及键盘遮挡处理和回收相关推荐
- [iOS] UITextField隐藏软键盘心得(隐藏自身软键盘、点击Return自动转到下个文本框、轻触背景隐藏软键盘)...
作者:zyl910 关于隐藏软键盘,网上的办法良莠不齐,大多是通过实现UITextFieldDelegate来隐藏软键盘,该方法代码较多,且在文本框很多的时不好处理.我经过搜索与摸索,找到了最佳的处理 ...
- 全局异步和主线程异步区别、改变PlaceHolder颜色、解决键盘弹起挡住文本框问题...
1.全局异步执行耗时任务 dispatch_async(dispatch_get_global_queue(0, 0), ^{ }); 2.主线程异步刷新UI dispatch_async(dispa ...
- java 文本框输入监听事件_JAVA GUI 事件监听事件 详解 和 案例.
GUI(图形用户界面) Graphical User Interface(图形用户接口) 用图形的 方式, 来显示 计算机操作的 界面, 这样更方便 更直观. CLI Command Line Use ...
- 比较简单的解决键盘遮挡文本框的简单方法
1.首先需要在控制器的view中添加上一个scrollView,并遵循UITextFieldDelegate代理,并设置文本框的自身代理 2.添加手势监听 UITapGestureRecognizer ...
- 混合开发的坑(7) ---输入文本时,键盘遮挡
CSS绝对定位于底部,输入文本时,键盘遮挡问题. 浏览器 正确 ios 正确 anroid 会遮挡 只能通过js来解决 转载于:https://www.cnblogs.com/huangqiao/ ...
- android+点击屏幕隐藏键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...
1,实现方法一: 通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏 android:id="@+id/traceroute ...
- [html] android手机的微信H5弹出的软键盘挡住了文本框,如何解决?
[html] android手机的微信H5弹出的软键盘挡住了文本框,如何解决? window.addEventListener("resize", function () {if ...
- tableView cell 中如果有文本框点击自动滚动不被键盘挡住
tableView cell 中如果有文本框点击自动滚动不被键盘挡住 tableView 是继承UIscrollView,所以自然有setContentOffset方法,该方法可以设置tableVie ...
- 文本框的值默认显示文本域上_13.4.4 键盘与文本事件
用户在使用键盘时会触发键盘事件."DOM2 级事件"最初规定了键盘事件,但在最终定稿之前又删除了相应的内容.结果,对键盘事件的支持主要遵循的是 DOM0 级. "DOM3 ...
最新文章
- linux文件夹加密访问,技术|Linux系统上用encfs创建和管理加密文件夹
- C和C++中的默认类型
- 开发人员如何了解用户和需求
- Winform 进度条
- [Python] L1-030. 一帮一-PAT团体程序设计天梯赛GPLT
- 等压线上怎么画风向_圣诞贺卡怎么写?向你爱的人送上最有温度的祝福吧!
- 将后台的返回的格式,根据某个共同的字段分组
- Strategy模式的一点思考
- 张家界和桂林的旅游纪实(避坑指南)
- KV杀毒软件创始人离世
- 手机端分页 php,网站开发-php开发手机论坛(9)-分页显示评论
- ##iOS中的微信支付 支付验证签名失败
- 淘宝商城,亚洲最大网上购物网站
- flutter 复制粘贴默认英文显示问题
- 浅谈Android相机演变
- 如何获取百度地图API
- 计算机培训ppt教案,课件制作的教案
- 22222222222
- 机器学习梯度下降法应用波士顿房价预测
- JAVA日记之SpringAOP_XML配置与注解开发 ----喝最烈的酒.