文章目录

  • 系统自带的样式
  • 自定义键盘
    • 在系统自带键盘基础上自定义键盘
    • 完全自定义键盘
  • 自定义全部类型键盘

系统自带的样式

  • 在iOS开发中系统自带键盘已经有很多样式,但是有时候并不能满足我们都开发需求,需要或大或小的改动,这时候就需要我们自定义键盘了,系统自带键盘样式如下:
public enum UIKeyboardType : Int {case `default` // Default type for the current input method.case asciiCapable // Displays a keyboard which can enter ASCII characterscase numbersAndPunctuation // Numbers and assorted punctuation.case URL // A type optimized for URL entry (shows . / .com prominently).case numberPad // A number pad with locale-appropriate digits (0-9, ۰-۹, ०-९, etc.). Suitable for PIN entry.case phonePad // A phone pad (1-9, *, 0, #, with letters under the numbers).case namePhonePad // A type optimized for entering a person's name or phone number.case emailAddress // A type optimized for multiple email address entry (shows space @ . prominently).@available(iOS 4.1, *)case decimalPad // A number pad with a decimal point.@available(iOS 5.0, *)case twitter // A type optimized for twitter text entry (easy access to @ #)@available(iOS 7.0, *)case webSearch // A default keyboard type with URL-oriented addition (shows space . prominently).@available(iOS 10.0, *)case asciiCapableNumberPad // A number pad (0-9) that will always be ASCII digits.
}

默认键盘效果图如下:

  • 这里需要说明一下键盘收起的方法:
    如果是单个输入框并且可以拿到该输入框想让键盘收起:textview.resignFirstResponder()
    如果是很多输入输入框,不想一一判断哪个输入框是第一响应者,或者不好拿到输入框变量,键盘收起的方法有:view.endEditing(true)
    如果想出发输入框为编辑状态,可以调用textview.becomeFirstResponder()

自定义键盘

  • 有时候我们需要在原有的键盘上加一些控件,不需要改变原有键盘的布局,这时候只需要监听键盘的弹出和退出的通知,计算frame,然后在window上添加对应的控件即可。有时候系统自带键盘都没法满足我们都需求就需要完全自定义键盘了。

在系统自带键盘基础上自定义键盘

  • 有时候我们只需要在现有的键盘上添加几个键,来组成自己想要的键盘如数字键盘没有收起键,可以添加一个收起键盘。
  • UITextFieldUITextView有一个inputAccessoryView的属性,当你想在键盘顶部展示一个自定义的view时,你就可以设置该属性。你设置的view就会自动和键盘keyboard一起显示了和隐藏。
  • 需要注意的是,你所自定义的view既不应该处在其他的视图层里,也不应该成为其他视图的子视图。其实也就是说,你所自定义的view只需要赋给属性inputAccessoryView就可以了,不要再做其他多余的操作。
  • 监听键盘弹出和收起的4个通知,我们可以通过这些通知来获取键盘的frame,动画时间,动画轨迹等信息,可以做一些界面的调整,比如键盘掏出时挡住了输入框,要调整输入框的frame等。
NSNotificationName_OC/Swift 对应的事件
UIKeyboardWillShowNotification / UIKeyboardWillShow 键盘将要弹出展示
UIKeyboardDidShowNotification / UIKeyboardDidShow 键盘已经弹出展示
UIKeyboardWillHideNotification / UIKeyboardWillHide 键盘将要收起隐藏
UIKeyboardDidHideNotification / UIKeyboardDidHide 键盘已经收起隐藏
  • 给数字键盘添加一个完成输入收起的按钮:
    override func viewDidLoad() {super.viewDidLoad()
//        let topView = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 50))
//        topView.barStyle = UIBarStyle.default
//        topView.backgroundColor = UIColor.bluelet topView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 50))topView.backgroundColor = UIColor.lightGraylet doneBtn = UIButton(type: UIButtonType.custom)doneBtn.frame = CGRect(x: UIScreen.main.bounds.size.width - 80, y: 10, width: 60, height: 30)doneBtn.setTitle("完成", for: UIControlState.normal)doneBtn.layer.cornerRadius = 5doneBtn.setTitleColor(UIColor.white, for: UIControlState.normal)doneBtn.backgroundColor = UIColor.bluedoneBtn.addTarget(self, action: #selector(endEidt), for: UIControlEvents.touchUpInside)topView.addSubview(doneBtn);textField.inputAccessoryView = topView;}@objc func endEidt(){view.endEditing(true)}


注意:如果是用UIToolbar通过addSubview方式添加完成按钮,在iOS11中按钮的点击事件是无法响应的,因为图层问题。

完全自定义键盘

  • 上面是在原有的键盘基础上添加一些自定义的视图,但是位置必须在原有键盘顶部,有一定的局限性。有时候我们需要改变键盘中键的位置标题等,如银行类app会有自定义安全键盘,身份证输入键盘等。(虽然身份证输入键盘可以在原有的基础上通过监听键盘的通知来添加和移出X按钮,但是会比较麻烦,完全自定义键盘反而更简单)。
  • UITextFieldUITextView有一个inputView的属性,inputView就是显示键盘的view,如果重写这个view则不再弹出键盘,而是弹出自己的view。所以我们完全可以自定义任何我们想要展现的键盘。(通过该属性我们还可以做相应的从底部弹出来的弹框,只需要设置 UITextFieldUITextView``inputView的属性为弹框视图,UITextFieldUITextView成为第一响应者则弹出,注销第一响应者则收起)。
  • 自定义一个数字安全键盘具体步骤如下:
    1. 自定键盘视图布局字控件
    2. 讲0~9数字随机排序并设置到键盘上展示
    3. 事件处理,0~9按键用于传值,每点击一下就拼接到UITextField/UITextView原有的text后面;删除建每点击一下就删除UITextField/UITextView的text最后一个字符;完成按钮用于收起键盘,并在收起键盘后重新对键盘文字随机排序,设置到数字按键上,这样下次弹出键盘时就是又一套排序的数字安全键盘
  • 具体如下:

自定义键盘:

import UIKit
//点击事件代理
@objc protocol CustomKeyboardDelegate: NSObjectProtocol {@objc optional func keyboardItemDidClicked(_ item: String?)@objc optional func deleteBtnClick()@objc optional func doneBtnClick()
}class CustomKeyboardView: UIView {weak var delegate: CustomKeyboardDelegate?override init(frame: CGRect) {super.init(frame: frame)let shuffledIntegers = numberArr()backgroundColor = UIColor.lightGray//布局子空件for index in 0..<12 {let btn = UIButton(type: .custom)btn.backgroundColor = UIColor.whitebtn.addTarget(self, action: #selector(self.buttonDidClicked(_:)), for: .touchUpInside)btn.frame = CGRect(x: self.frame.width / 3 * (CGFloat)(index % 3), y: (CGFloat)(45 * (index / 3)), width: self.frame.width / 3 - 1, height:44.0)addSubview(btn)btn.layer.borderWidth = 3btn.layer.borderColor = UIColor.lightGray.cgColorbtn.layer.cornerRadius = 5btn.tag = 100+indexbtn.setTitleColor(UIColor.black, for: .normal)if index == 10{btn.setTitle("删除", for: .normal)btn.setTitleColor(UIColor.red, for: .normal)}else if index == 11{btn.setTitle("完成", for: .normal)btn.setTitleColor(UIColor.blue, for: .normal)}else{let indexString = "\(shuffledIntegers![index])"btn.setTitle(indexString, for: .normal)}}}required init?(coder aDecoder: NSCoder) {fatalError("init(coder:) has not been implemented")}}extension CustomKeyboardView{//随机排序0~9func numberArr() -> [Any]? {let startArray = NSMutableArray(array: [0,1,2,3,4,5,6,7,8,9])let resultArray = NSMutableArray()for i in 0..<startArray.count {let t = arc4random() % UInt32(startArray.count)resultArray[i] = startArray[Int(t)]startArray[Int(t)] = startArray.lastObject as AnystartArray.removeLastObject()}return (resultArray as! [Any])}//点击事件@objc func buttonDidClicked(_ sender: UIButton?) {let index = sender!.tag - 100if index < 10 {//传值if (delegate != nil && (delegate?.responds(to: #selector(CustomKeyboardDelegate.keyboardItemDidClicked(_:))))!) {delegate?.keyboardItemDidClicked!(sender?.titleLabel?.text)}}else if (index == 10){//删除if (delegate != nil && (delegate?.responds(to: #selector(CustomKeyboardDelegate.deleteBtnClick)))!) {delegate?.deleteBtnClick!()}}else{//收起键盘刷新键盘数字if (delegate != nil && (delegate?.responds(to: #selector(CustomKeyboardDelegate.doneBtnClick)))!) {delegate?.doneBtnClick!()reloadKeyBoard()}}}//重新设置按钮标题func reloadKeyBoard(){let arr = (numberArr()as! Array<NSNumber>)for index in 0..<arr.count {let btn = (self.viewWithTag(Int(index)+100)) as!UIButtonlet indexString = "\(arr[index])"btn.setTitle(indexString, for: UIControlState.normal)}}
}

自定义键盘使用:

class CustomTwoViewController: UIViewController{@IBOutlet weak var textField: UITextField!override func viewDidLoad() {super.viewDidLoad()let custimKB = CustomKeyboardView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 180+34))custimKB.delegate = self as CustomKeyboardDelegate;textField.inputView = custimKB;textField.delegate = self as UITextFieldDelegate}
}
//自定义键盘代理方法
extension CustomTwoViewController:CustomKeyboardDelegate,UITextFieldDelegate{//拼接字符代理func keyboardItemDidClicked(_ item: String?) {textField.text = textField.text! + (item ?? "")}//删除字符代理func deleteBtnClick(){if textField.text != nil && (textField.text?.count)!>0 {var str = textField.text!//删除最后一个元素str.removeLast()textField.text = str}}//完成安妞func doneBtnClick(){view.endEditing(true)}
}

效果图如下:

  • 注意:
    这里支队iPhone X适配,对于其他机型还需要最额外的适配工作。
    inputView不会随着键盘出现而出现,设置了InputView只会当UITextField或者UITextView变为第一相应者时显示出来, 不会显示键盘了。设置了InputAccessoryView,它会随着键盘一起出现并且会显示在键盘的顶端。InutAccessoryView默认为 nil.

自定义全部类型键盘

  • 这里用完全自定义的方法写了个字母、数字、符号之间可以切换输入的键盘,并且进行了iPhoneX、XR、XS、XS Max等适配,效果如下:


    相关源码:自定义全部类型键盘

自定义键盘demo
参考文档:
iOS自定义安全键盘

iOS开发中键盘样式和自定义键盘。相关推荐

  1. ios 开发 键盘 android,UiOS开发中ITextView回收或关闭键盘使用方法总结

    iOS开发中,发现UITextView没有像UITextField中textFieldShouldReturn:这样的方法,那么要实现UITextView关闭键盘,就必须使用其他的方法,下面是可以使用 ...

  2. iOS开发中经常用的实用代码合集

    iOS开发中经常用的实用代码合集 本文整理了,在iOS开发中我们所遇到一些开发问题的技巧类的代码,让你在开发过程中避免了很多弯路,希望能给你的开发带来帮助和启发. 1.判断邮箱格式是否正确的代码: / ...

  3. iOS开发中一些有用的小代码

    1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @&quo ...

  4. iOS开发中常用的方法

    iOS开发中常用的方法 系统弹窗: 过期方法: UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"确认报价" ...

  5. iOS 开发中的 Flux 架构模式

    本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时 ...

  6. iOS开发中的神兵利器 [实战系列]-李发展-专题视频课程

    iOS开发中的神兵利器 [实战系列]-11758人已学习 课程介绍         - 140节课程讲解GitHub中近百个过千star的iOS热门开源项目 - 市面上唯一大规模讲解热门的iOS开源项 ...

  7. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

  8. [贝聊科技]如何在iOS开发中更好的做假数据?

    当工期比较紧的时候,项目开发中会经常出现移动端等待后端接口数据的情形,不但耽误项目进度,更让人有种无奈的绝望.所以在开发中,我们常常自己做些假数据,以方便开发和UI调试.然而做假数据方法不同,效率和安 ...

  9. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

最新文章

  1. fragment切换事件
  2. 阿里云物联网生活平台简介
  3. 输出和为n的所有的连续自然数序列
  4. Python——基于OpenCV获取倾斜子图的一种方法
  5. 关于Myeclipse2017 MemoryAnalyzer的安装
  6. 根据Ip获取城市帮助类
  7. 强烈推荐《价值:我对投资的思考》
  8. 基于JAVA+SpringBoot+MYSQL的医院预约挂号平台
  9. UFT11.5如何复用QTP9.2的脚本
  10. 跟着偶像学大数据——开端篇
  11. 浪潮信息能制造超级计算机吗,浪潮信息为中国航天探索事业出力 高性能计算技术领衔...
  12. ADADELTA: AN ADAPTIVE LEARNING RATE METHOD
  13. STM32F4 USB3300 fs/hs uvc实现ov2640的图像传输和静态图片
  14. 易语言单窗口单ip软件源码_易语言助手下载-易语言助手 v3.2.0701 官方版
  15. 数据结构与算法 | 用Java语言实现顺序表真的不难
  16. Halcon例程分析2:颜色检测识别
  17. 12星座的出生年月日性格_12星座的出生年月以及性格分析 复制的也可以
  18. kali之vulhub,medium_socnet
  19. 利用Vivado逻辑分析仪ila观察信号
  20. 用友T3普及版安装步骤

热门文章

  1. 关闭与卸载xxx终端防护系统时需要密码怎么办?
  2. Hoofball(B题)
  3. 在可靠的头肩底中淘金(转 封起De日子)
  4. 服务器常用语言,计算机常用词汇--语言及服务器篇
  5. HTML/CSS 常用单词整理
  6. 三门问题:张三模拟了100000遍告诉你答案 内附Matlab代码
  7. Buzzsumo大型教程(内容营销+外链outreach必备)营销神器
  8. 范数规则化(一):L0、L1与L2范数
  9. 领带打法最新10种(图解)
  10. 石油工程课程设计c语言,东北石油大学-石油工程抽油设计C语言编程.doc