Swift - 在软键盘上添加自定义按钮(增加return键)

我们知道设备的虚拟键盘不管使用的是纯数字键盘(numberPad),还是带小数点的数字键盘(decimalPad),它们默认是都不带 return 键的。

方法一:在键盘的顶部添加一个 toolbar

1、实现方法

(1)我们通过 textField 的 inputAccessoryView 属性,先在虚拟键盘的上方添加一个 UIToolbar。

(2)然后在这个 UIToolbar 内添加我们需要的按钮(return、done 等),个数随意。 

2、效果图

(1)可以看到键盘弹出后,顶部会增加一个工具栏,其中有个“完成”按钮。

(2)点击“完成”按钮会收起键盘,并在控制台中将输入的内容打印出来。 

Swift - 在软键盘上添加自定义按钮(增加return键)_第1张图片
图例

3、样例代码

Swift - 在软键盘上添加自定义按钮(增加return键)_第2张图片
代码

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    var textField:UITextField!

    override func viewDidLoad() {

        super.viewDidLoad()

        //创建并添加一个 UITextField

        textField = UITextField(frame: CGRect(x:20,y:90,width:200,height:30))

        //设置边框样式为圆角矩形

        textField.borderStyle = UITextBorderStyle.roundedRect

        //带小数点的数字键盘

        textField.keyboardType = UIKeyboardType.decimalPad

        self.view.addSubview(textField)

        //在键盘上添加“完成“按钮

        addDoneButtonOnKeyboard()

    }

    //在键盘上添加“完成“按钮

    func addDoneButtonOnKeyboard() {

        let doneToolbar = UIToolbar()

        //左侧的空隙

        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,

                                        target: nil, action: nil)

        //右侧的完成按钮

        let done: UIBarButtonItem = UIBarButtonItem(title: "完成", style: .done,

                                                    target: self,

                                                    action: #selector(doneButtonAction))

        var items:[UIBarButtonItem] = []

        items.append(flexSpace)

        items.append(done)

        doneToolbar.items = items

        doneToolbar.sizeToFit()

        self.textField.inputAccessoryView = doneToolbar

    }

    //“完成“按钮点击响应

    func doneButtonAction() {

        //收起键盘

        self.textField.resignFirstResponder()

        print("您输入的是:\(textField.text!)")

    }

}



方法二:直接在键盘上添加一个按钮

1、实现方法

(1)我们可以发现纯数字键盘(numberPad)左下角刚好有一个空闲的位置,那么可以将自定义按钮添加到这个位置上。

(2)要实现这个功能,我们首先要监听键盘出现的事件。在键盘出现后找到键盘的窗体,然后将我们自定义按钮添加到窗体中即可。

(3)要注意的是自定义按钮的位置,同时在其出现时还要添加个动画效果,确保自定义按钮能同键盘一起向上弹出显示。 

2、效果图

(1)可以看到键盘弹出后,左下角多了个“完成”按钮。

(2)点击“完成”按钮便会收起键盘,并在控制台中将输入的内容打印出来

Swift - 在软键盘上添加自定义按钮(增加return键)_第3张图片
图例

3、样例代码

Swift - 在软键盘上添加自定义按钮(增加return键)_第4张图片
代码1
Swift - 在软键盘上添加自定义按钮(增加return键)_第5张图片
代码2

import UIKit

class ViewController: UIViewController,UITextFieldDelegate {

    var textField:UITextField!

    var doneButton:UIButton!

    override func viewDidLoad() {

        super.viewDidLoad()

        //创建并添加一个 UITextField

        textField = UITextField(frame: CGRect(x:20,y:90,width:200,height:30))

        //设置边框样式为圆角矩形

        textField.borderStyle = UITextBorderStyle.roundedRect

        //带小数点的数字键盘

        textField.keyboardType = UIKeyboardType.numberPad

        self.view.addSubview(textField)

        //创建要添加到键盘上的“完成”按钮

        doneButton = UIButton()

        doneButton.setTitle("完成", for: UIControlState())

        doneButton.setTitleColor(UIColor.black, for: UIControlState())

        doneButton.frame = CGRect(x: 0, y: 0, width: 106, height: 53)

        doneButton.adjustsImageWhenHighlighted = false

        doneButton.addTarget(self, action: #selector(doneButtonAction), for: .touchUpInside)

        //监听键盘弹出通知

        NotificationCenter.default

            .addObserver(self,selector: #selector(keyboardWillShow(_:)),

                         name: NSNotification.Name.UIKeyboardWillShow, object: nil)

        //监听键盘隐藏通知

        NotificationCenter.default

            .addObserver(self,selector: #selector(keyboardWillHide(_:)),

                         name: NSNotification.Name.UIKeyboardWillHide, object: nil)

    }

    //键盘显示

    func keyboardWillShow(_ note : Notification) -> Void{

        DispatchQueue.main.async { () -> Void in

            //找到键盘的window

            let keyBoardWindow = UIApplication.shared.windows.last

            //将“完成”按钮添加到键盘的window中

            keyBoardWindow?.addSubview(self.doneButton)

            keyBoardWindow?.bringSubview(toFront: self.doneButton)


            //显示“完成”按钮

            self.doneButton.isHidden = false

            //计算“完成”按钮最终要显示的y坐标

            let doneButtonY = (keyBoardWindow?.frame.size.height)! - 53


            if let userInfo = note.userInfo,

                let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue,

                let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double,

                let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? UInt {


                let frame = value.cgRectValue

                //获取虚拟键盘实际的位置和尺寸

                let intersection = frame.intersection(self.view.frame)


                //设置“完成”按钮最开始的y坐标

                self.doneButton.frame.origin.y = doneButtonY + intersection.height


                //让“完成”按钮跟随键盘出现动画移动到最终的位置

                UIView.animate(withDuration: duration, delay: 0.0,

                               options: UIViewAnimationOptions(rawValue: curve),

                               animations: { _ in

                                self.doneButton.frame.origin.y = doneButtonY

                }, completion: nil)

            }

        }

    }


    //键盘隐藏

    func keyboardWillHide(_ notification: Notification) {

        //隐藏“完成”按钮

        self.doneButton.isHidden = true

    }

    //“完成“按钮点击响应

    func doneButtonAction() {

        //收起键盘

        self.textField.resignFirstResponder()

        print("您输入的是:\(textField.text!)")

    }

}

你可能感兴趣的:(Swift - 在软键盘上添加自定义按钮(增加return键))