ios自定义数字键盘
因为项目又一个提现的功能,textfiled文本框输入需要弹出数字键盘,首先想到的就是设置textfiled的keyboardType为numberPad,此时你会看到如下的效果:
但是很遗憾这样设置虽然出现了数字键盘,但是对于我们提现的这个功能来说是需要小数的,所以需要一个小数点 但是使用上面的键盘显然不能满足我们的需求,那么应该如何解决这样的问题呢? 想了一下,有两个方法取实现:
1.自定义一个键盘视图
2.在系统键盘的基础上修改
经过思考,自定义键盘代价太大,所以我才用了第二种方法。
为了在系统键盘基础上修改,首先我们需要拿到键盘,那么如何拿到呢?我们知道键盘也是一个window, 所以最简单的方式就是打印出当前视图上面的window,拿到键盘所属的window,然后遍历内部的子控件即可 但是我没有直接取打印,我直接通过程序的调用栈就可以看到当前键盘所属的window及其内部的子控件,以下是我通过程序调用栈看到的结果:
![]()
可以看到键盘是一个名字叫UIRemoteKeyboardWindow的window 管理的,然后通过上图可以看到真正键盘输入视图应该是叫UIInputSetHostView,真正的键盘面板的父视图是一个叫UIKBKeyplaneView的view ,我们可以看到UIKBKeyplaneView李 main的第一个子控件是一个叫UIKBSplitImageView 这个就是底部的删除按钮(暂且我们就叫里面的每一个控件为按钮吧)剩余的都对应于 1 2 3 4 5 6 7 8 9 0 这几个控件 都是UIKBKeyView类型的。
通过上面的分析之后,我们就很好做了,我们只需要拿到键盘面板视图 在它上面添加一个小数点按钮 即可。注意如果添加子控件需要响应事件,必须添加到UIKBKeyplaneView这个视图上面,否则添加的子控件将无法响应事件。
通过上面分析我们就很好下手了, 所以接下来我们上代码:
第一步自定义一个小数点按钮:
/// 自定义键盘小数点按钮
lazyvarpointBtn:UIButton= {
letpointBtn = UIButton()
pointBtn.frame = CGRect(x:0, y:162, width:106, height:54)
pointBtn.setTitle(".", for: .normal)
pointBtn.tag =0xffbb33
pointBtn.titleLabel?.font = UIFont.boldSystemFont(ofSize:35)
pointBtn.setTitleColor(UIColor.black, for: .normal)
pointBtn.addTarget(self, action:#selector(pointBtnClick), for: .touchUpInside)
return pointBtn
}()
然后我们需要监听键盘将要显示的通知,在键盘将要显示的时候添加我们自己的按钮,我们在控制器里实现如下代码:
//监听键盘弹出
NotificationCenter.default.addObserver(self, selector:#selector(keyBoardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object:nil)
然后实现监听方法:
//键盘的出现
func keyBoardWillShow(_notification:Notification){
addPointBtn()
}
/// 添加小数点按钮
func addPointBtn(){
varfoundKeyboard:UIView?
varkeyboardWindow:UIWindow?
fortestWindowinUIApplication.shared.windows {
iftestWindow.description.hasPrefix("
keyboardWindow = testWindow
break
}
}
if(keyboardWindow ==nil) {return}
forpossibleKeyboardinkeyboardWindow!.subviews {
MyLog(message:"keyboardWindow==\(possibleKeyboard)")
ifpossibleKeyboard.description.hasPrefix("
MyLog(message:"possibleKeyboard==\(possibleKeyboard)")
forpossibleKeyboard_2inpossibleKeyboard.subviews {
MyLog(message:"possibleKeyboard_2==\(possibleKeyboard_2)")
ifpossibleKeyboard_2.description.hasPrefix("
//查找键盘面板视图
foundKeyboard = findInputPlaneView(superView: possibleKeyboard_2)
//添加按钮
if(foundKeyboard !=nil) {
//如果没有添加过小数点按钮就添加
//if (foundKeyboard!.viewWithTag(0xffbb33) == nil) {
foundKeyboard!.addSubview(pointBtn)
MyLog(message:"添加小数点按钮")
//}
}
return
}
}
}
}
}
/// 查找键盘的面板视图
funcfindInputPlaneView(superView:UIView)->UIView?{
varplaneView:UIView?
forsubviewinsuperView.subviews {
ifsubview.description.hasPrefix("
MyLog(message:"找到键盘面板")
returnsubview
}else{
planeView = findInputPlaneView(superView: subview)
}
}
return planeView
}
最后我们再实现小数点按钮点击的事件即可:
/// 小数点按钮的点击
funcpointBtnClick(){
//如果没有输入内容 直接退出
iftextField.text ==nil|| textField.text ==""{
return
}
//判断是否已经输入了小数点
if!textField.text!.contains(".") {//如果没有输入小数点就添加小数点到当前内容的末尾
letoldStrin = textField.text!.appending(".")
textField.text = oldStrin
}
MyLog(message:"pointBtnClickpointBtnClickpointBtnClickpointBtnClick")
}
然后运行项目之后,你会发现键盘左下角就添加了我们自己的小数点按钮了。
小数点按钮的位置是通过计算的,通过打印我发现了键盘的高度为216 ,键盘宽度肯定是屏幕的宽度,然后每行每列显示的视图个数固定,想想你知道如何算的。
现在我们的小数点就可以输入了,接下来最后一步限制用户只能输入小数点后面两位,
实现textfield的代理方法
//限制只能输入金额
functextField(_textField:UITextField, shouldChangeCharactersIn range:NSRange, replacementString string:String) ->Bool{
letnewString = (textField.text!asNSString).replacingCharacters(in: range, with: string)
letexpression ="^[0-9]*((\\.)[0-9]{0,2})?$"
letregex =try! NSRegularExpression(pattern: expression, options: NSRegularExpression.Options.allowCommentsAndWhitespace)
letnumberOfMatches = regex.numberOfMatches(in: newString, options:NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, (newStringasNSString).length))
return numberOfMatches !=0
}
到此基本就完成了我们想要的效果了
ios自定义数字键盘的更多相关文章
- iOS 系统数字键盘左下角加确定按钮
首先在 viewWillAppear 方法中注册监听相应的键盘通知,并且要在 viewWillDisappear 方法中注销通知- (void)viewWillAppear:(BOOL)animate ...
- ios在数字键盘左下角添加“完成”按钮的实现原理
本文转载至 http://www.itnose.net/detail/6145865.html 最近要在系统弹出的数字键盘上的左下角额外添加一个自定制的完成按钮,于是研究了一下系统自带键盘添加自定制按 ...
- iOS为数字键盘增加完成按钮
在输入价格的时候,要求弹出的键盘只能有数字和小数点.弹出的键盘没有完成键,想要退出键盘可以点击退出,但是为了更好的用户体验,在键盘上增加UIToolbar. 设置ToolBar: - (UIToolb ...
- GridLayout自定义数字键盘(两个EditText)
功能说明: 适用于两个EditText输入框,并控制输入字符的长度,点击键盘中的"确定"按钮完成输入,点击"前一项"光标跳到前一个EditText 运行效果图如 ...
- html5自定义数字键盘
原理:使用div模拟输入框,避免手机原生键盘弹出,键盘使用div模拟,点击事件使用js控制,光标闪烁使用css模拟,具体代码如下: <!doctype html> <html lan ...
- 【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)
在Vue中的项目,基于VUX-UI开发,一个常见的需求: 1.金额输入框 2.弹出数字键盘 3.仅支持输入两位小数,限制最大11位数,不允许0开头 后续:与UI沟通后, 思路调整为限制输入,并减少正则 ...
- h5仿微信、支付宝数字键盘|微信支付键盘|支付宝付款键盘
html5仿微信支付数字键盘|仿支付宝键盘|h5仿微信密码输入键盘|自定义数字键盘 很早之前由于项目需求,就有开发过一个h5仿微信支付键盘,这几天就把之前的数字键盘模块独立出来,重新整理开发成demo ...
- iOS数字键盘自定义按键
UIKeyboardTypeNumberPad 数字键盘自定义按键 最近做一个搜索用户的功能,这里使用了UISearchBar.由于搜索的方式只有手机号码,所以这里的键盘要限制为数字输入,可以这么做: ...
- 【iOS自定义键盘及键盘切换】详解
[iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...
随机推荐
- 必应app测试
一.app评测 1.个人使用体验 第一次使用必应app看到是微软这么一个大公司做的英语词典,应该会很有名但是我居然没有听说过.当我打开这个软件使用的时候看到界面的视频感觉还不错.但是总感觉这样的app ...
- 团队作业7——Alpha冲刺之事后诸葛亮(宣告项目失败团队解散)
一.项目进度 1.4月5日,团队组建.满怀希望的能做好这个项目 2.4月12日,需求分析. 3.4月21日,需求改进,出现协作问题,没有做好. 4.做项目,学习新的知识,继续做项目,但是能力有限,团队 ...
- 【Beta阶段】第三次scrum meeting
Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 打包上传团队代码 100% 查找适合的素材模块,和105一起把手势功能连接 ...
- 学号:201521123116 《java程序设计》第七周学习总结
1. 本周学习总结 2. 书面作业 Q1 ArrayList代码分析 1.1 解释ArrayList的contains源代码ArrayList的contains源代码 1.2 解释E remove(i ...
- eclipse ide for java ee developers与eclipse ide for java developers有什么区别
前者集成了WTP,可用于j2ee开发,功能更完善
- Java-Preferences用法-入门
Properties提供的应用程序解决方案主要存在两个问题: (1)配置文件不能放在主目录中,因为某些OS(如Win9X)没有主目录的概念: (2)没有标准的文件命名规则,存在文件名冲突的可能性. J ...
- Java:参数数量可变的方法
许多Java新人在看到下面的这段代码的时候,都会问一个问题:dealArray方法里那三个小点点是什么啊? [java] view plaincopy public class TestVarArgu ...
- Mysql修改id自增值
如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数 truncate table 表名 如果想保留之前的记录,从某一id(3356)重新开始 alter table 表名 ...
- 深入理解分布式调度框架TBSchedule及源码分析
简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...
- SpringMVC的数据格式化-注解驱动的属性格式化
一.什么是注解驱动的属性格式化? --在bean的属性中设置,SpringMVC处理 方法参数绑定数据.模型数据输出时自动通过注解应用格式化的功能. 二.注解类型 1.DateTimeFormat @ ...