因为项目又一个提现的功能,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自定义数字键盘的更多相关文章

  1. iOS 系统数字键盘左下角加确定按钮

    首先在 viewWillAppear 方法中注册监听相应的键盘通知,并且要在 viewWillDisappear 方法中注销通知- (void)viewWillAppear:(BOOL)animate ...

  2. ios在数字键盘左下角添加“完成”按钮的实现原理

    本文转载至 http://www.itnose.net/detail/6145865.html 最近要在系统弹出的数字键盘上的左下角额外添加一个自定制的完成按钮,于是研究了一下系统自带键盘添加自定制按 ...

  3. iOS为数字键盘增加完成按钮

    在输入价格的时候,要求弹出的键盘只能有数字和小数点.弹出的键盘没有完成键,想要退出键盘可以点击退出,但是为了更好的用户体验,在键盘上增加UIToolbar. 设置ToolBar: - (UIToolb ...

  4. GridLayout自定义数字键盘(两个EditText)

    功能说明: 适用于两个EditText输入框,并控制输入字符的长度,点击键盘中的"确定"按钮完成输入,点击"前一项"光标跳到前一个EditText 运行效果图如 ...

  5. html5自定义数字键盘

    原理:使用div模拟输入框,避免手机原生键盘弹出,键盘使用div模拟,点击事件使用js控制,光标闪烁使用css模拟,具体代码如下: <!doctype html> <html lan ...

  6. 【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)

    在Vue中的项目,基于VUX-UI开发,一个常见的需求: 1.金额输入框 2.弹出数字键盘 3.仅支持输入两位小数,限制最大11位数,不允许0开头 后续:与UI沟通后, 思路调整为限制输入,并减少正则 ...

  7. h5仿微信、支付宝数字键盘|微信支付键盘|支付宝付款键盘

    html5仿微信支付数字键盘|仿支付宝键盘|h5仿微信密码输入键盘|自定义数字键盘 很早之前由于项目需求,就有开发过一个h5仿微信支付键盘,这几天就把之前的数字键盘模块独立出来,重新整理开发成demo ...

  8. iOS数字键盘自定义按键

    UIKeyboardTypeNumberPad 数字键盘自定义按键 最近做一个搜索用户的功能,这里使用了UISearchBar.由于搜索的方式只有手机号码,所以这里的键盘要限制为数字输入,可以这么做: ...

  9. 【iOS自定义键盘及键盘切换】详解

    [iOS自定义键盘]详解 实现效果展示: 一.实现的协议方法代码 #import <UIKit/UIKit.h> //创建自定义键盘协议 @protocol XFG_KeyBoardDel ...

随机推荐

  1. 团队作业8——第二次项目冲刺(Beta阶段)5.25

    1.当天站立式会议照片 会议内容: 本次会议为第六次会议 本次会议在陆大楼3楼召开,本次会议内容: ①:检查总结上次任务完成情况 ②:安排今天的分工 ③:对昨天的问题进行讨论 ④:遇到困难,及时群里反 ...

  2. 201521123064 《Java程序设计》第7周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 2. 书面作业 Q1:ArrayList代码分析 1.1 解释ArrayList的contains源 ...

  3. 201521123022 《Java程序设计》 第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 Q1.clone方法 Q1.1 Objec ...

  4. 201521123026 《Java程序设计》第一周学习总结

    1. 本章学习总结 1.简要了解JAVA的发展史以及其特点(面向对象.跨平台性,健壮性,安全性,可移植性,多线程性,动态性等) 2.认识JAVA三大平台(Java SE,Java EE,JavaME) ...

  5. 201521123062 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  6. 201521123001《Java程序设计》第11周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  7. ACM退役记&&回忆录

    ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...

  8. 框架应用:Spring framework (四) - 事务管理

    事务控制 事务是什么?事务控制? 事务这个词最早是在数据库中进行应用,讲的用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位. 事务的管理是指一个事务的开启,内容添加, ...

  9. JAVA数据流再传递

    有一个filter类,在请求进入的时候读取了URL信息,并且读取了requestBod中的参数信息,那么在请求到达实际的控制层时,入参信息是拿不到的,对这种情况就需要数据流做再传递处理. 处理原理:使 ...

  10. centOS7服务管理与启动流程

    centOS7服务管理与启动流程 centOS7启动流程 systemd简介 unit对象 unit类型 特性 service unit文件格式 service unit file文件通常由三部分组成 ...