因为项目又一个提现的功能,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. 【Alpha】第一次Daily Scrum Meeting

    一.今日站立式会议照片 二.会议内容 1.调研市场现有礼物挑选软件,分析优势,亮点,劣势 2.确立开发环境和安装调试 三.燃尽图 四.遇到的困难 在准备开发环境和安装调试时遇到系统和开发环境不要兼容, ...

  2. 结对作业1--基于GUI的四则运算

    201421123002 翁珊,201421123006 黄月梅,201421123007 徐晓珊 题目描述: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程 ...

  3. 201521123085 《JAVA程序设计》第6周学习总结

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

  4. 201521123103 《Java学习笔记》 第四周学习总结

    一.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. (1)多态性:相同形态,不同行为(不同的定义): (2)多态绑定:运行时能够自动地选择调用哪个 ...

  5. 201521123018 《Java程序设计》第2周学习总结

    1. 本章学习总结 * String类 * Java数组Array的使用 2. 书面作业 Q1.(1) 使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)? (2)分析Stri ...

  6. windows消息机制与实例

    windows发送窗口消息 所需工具:spy++,visual studio 2017,c#语言 技术路线:首先通过spy++获得所要操纵的窗口的句柄,函数的原型声明为: [DllImport(&qu ...

  7. 《JAVA程序设计》第10周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fin ...

  8. Java课程设计——GUI密码生成器团队博客

    1.团队名称.团队成员介绍(需要有照片) 1.1团队名称 小黄人 1.2团队成员介绍 吴玲:组长,现任院就业会策划部副部长 郭琪容:组员,现任院硬件协会会长 2. 项目git地址 吴 玲 郭琪容 3. ...

  9. Android 跳转系统选择本地视频的功能

    今天在项目开发的过程中产品要求添加选择本地视频的功能,于是就翻阅和查找各种资料,进行功能的开发,但是在开发过程中发现,各种不同的品牌的手机跳转至系统选择本地视频的功能结果不太一样,所以我就对一些主流的 ...

  10. 史上最全CentOS安装教程,图文结合

    这是我最近整理的一份最全的CentOS安装步骤,亲自测试步骤,步步都有截图,步骤清晰.按此教程可轻松装机,并且安装成功的主机能访问外部网络. 闲话不说,首先介绍一下本教程用到工具: VMware Wo ...